blob: e7593f93b3190a4cc82a6dc982254d76908156b8 [file] [log] [blame]
import time
import grpc
from google.protobuf.empty_pb2 import Empty
from twisted.internet import reactor
from twisted.internet import threads
from twisted.internet.defer import Deferred, inlineCallbacks, DeferredQueue
from streaming_pb2 import ExperimentalServiceStub, Echo
def asleep(t):
d = Deferred()
reactor.callLater(t, d.callback, None)
return d
t0 = time.time()
def pr(s):
print '%lf %s' % (time.time() - t0, s)
class ClientServices(object):
def async_receive_stream(self, func, *args, **kw):
queue = DeferredQueue()
def _execute():
for result in func(*args, **kw):
reactor.callFromThread(queue.put, result)
_ = threads.deferToThread(_execute)
while 1:
yield queue.get()
@inlineCallbacks
def echo_loop(self, stub, prefix='', interval=1.0):
"""Send an echo message and print its return value"""
seq = 0
while 1:
msg = 'ECHO%05d' % seq
pr('{}sending echo {}'.format(prefix, msg))
request = Echo(msg=msg, delay=interval)
response = yield threads.deferToThread(stub.GetEcho, request)
pr('{} got echo {}'.format(prefix, response.msg))
seq += 1
yield asleep(interval)
@inlineCallbacks
def receive_async_events(self, stub):
e = Empty()
for next in self.async_receive_stream(stub.ReceiveStreamedEvents, e):
event = yield next
if event.seq % 100 == 0:
pr('event received: %s %s %s' % (
event.seq, event.type, event.details))
if __name__ == '__main__':
client_services = ClientServices()
channel = grpc.insecure_channel('localhost:50050')
stub = ExperimentalServiceStub(channel)
reactor.callLater(0, client_services.echo_loop, stub, '', 0.2)
reactor.callLater(0, client_services.echo_loop, stub, 40*' ', 2)
reactor.callLater(0, client_services.receive_async_events, stub)
reactor.run()