Skip to content

Instantly share code, notes, and snippets.

@snaury
Last active October 8, 2015 06:38
Show Gist options
  • Save snaury/fa19b63e3ed666c890bf to your computer and use it in GitHub Desktop.
Save snaury/fa19b63e3ed666c890bf to your computer and use it in GitHub Desktop.
Scheduling latencies with gevent/greenlet
Total time: 1.027ms
Latencies: 0.228ms-0.390ms
First-last send: 0.308ms
First-last recv: 0.050ms
First-last return: 0.146ms
import time
import gevent
from gevent.queue import Queue
from gevent.event import AsyncResult
class Context(object):
def __init__(self):
self.requests = Queue()
self.latencies = []
self.first_send = None
self.first_recv = None
self.first_ret = None
self.last_send = None
self.last_recv = None
self.last_ret = None
def queue_worker(ctx):
while True:
r, value = ctx.requests.get()
t = time.time()
if ctx.first_recv is None:
ctx.first_recv = t
ctx.last_recv = t
r.set(value)
def send_get_reply(ctx, value):
t = time.time()
if ctx.first_send is None:
ctx.first_send = t
ctx.last_send = t
r = AsyncResult()
ctx.requests.put((r, value))
result = r.get()
t1 = time.time()
ctx.latencies.append(t1 - t)
if ctx.first_ret is None:
ctx.first_ret = t1
ctx.last_ret = t1
return result
def requester(ctx, index):
send_get_reply(ctx, index)
def main():
ctx = Context()
gevent.spawn(queue_worker, ctx)
t0 = time.time()
gg = [gevent.spawn(requester, ctx, index) for index in xrange(30)]
gevent.wait(gg)
for g in gg:
g.get()
t1 = time.time()
ctx.latencies.sort()
print 'Total time: %.3fms' % ((t1 - t0) * 1000,)
print 'Latencies: %.3fms-%.3fms' % (ctx.latencies[0] * 1000, ctx.latencies[-1] * 1000)
print 'First-last send: %.3fms' % ((ctx.last_send - ctx.first_send) * 1000,)
print 'First-last recv: %.3fms' % ((ctx.last_recv - ctx.first_recv) * 1000,)
print 'First-last return: %.3fms' % ((ctx.last_ret - ctx.first_ret) * 1000,)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment