Skip to content

Instantly share code, notes, and snippets.

@jeffguorg
Last active September 12, 2018 08:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeffguorg/250f2b37971a1772969fef12b93324b0 to your computer and use it in GitHub Desktop.
Save jeffguorg/250f2b37971a1772969fef12b93324b0 to your computer and use it in GitHub Desktop.
an asyncio daemon pattern
import asyncio
import queue
ioloop = asyncio.get_event_loop()
def timer(interval=5):
def wrapper(func):
async def runner(*args, **kwargs):
while True:
asyncio.ensure_future(func(*args, **kwargs))
await asyncio.sleep(interval)
return runner
return wrapper
class ConcurrencyExceededException(Exception):
pass
def locker(quiet=True, concurrency=1):
assert concurrency > 0
locker_queue = queue.Queue(maxsize=concurrency)
def wrapper(func):
async def runner(*args, **kwargs):
try:
locker_queue.put(object(), block=False)
except queue.Full:
if quiet:
return
else:
raise ConcurrencyExceededException()
try:
return await func(*args, **kwargs)
finally:
locker_queue.get()
return runner
return wrapper
@timer(1)
@locker(quiet=False, concurrency=2)
async def test():
await asyncio.sleep(5)
print("hey")
ioloop.run_until_complete(test())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment