Skip to content

Instantly share code, notes, and snippets.

@maxpoletaev
Last active November 1, 2016 11:54
Show Gist options
  • Save maxpoletaev/a8b0f983042c06c08848 to your computer and use it in GitHub Desktop.
Save maxpoletaev/a8b0f983042c06c08848 to your computer and use it in GitHub Desktop.
Async decorator
from threading import Thread
from queue import Queue
tasks = {}
def task_consumer(queue):
while True:
try:
task, args, kwargs = queue.get()
except KeyboardInterrupt:
return
tasks[task](*args, **kwargs)
def run_async(fn=None, name=None):
def wrapper(fn):
task_name = name or fn.__name__
tasks[task_name] = fn
def decorator(*args, **kwargs):
task_queue.put((task_name, args, kwargs))
return decorator
return wrapper(fn) if fn else wrapper
def start_workers(queue, concurrency=1):
for _ in range(concurrency):
worker = Thread(target=task_consumer, args=(queue,))
worker.daemon = True
worker.start()
task_queue = Queue()
start_workers(task_queue)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment