Skip to content

Instantly share code, notes, and snippets.

@websmithcode
Last active August 8, 2024 20:35
Show Gist options
  • Save websmithcode/9de1817347f6a3c4a9b863a91bdf52e7 to your computer and use it in GitHub Desktop.
Save websmithcode/9de1817347f6a3c4a9b863a91bdf52e7 to your computer and use it in GitHub Desktop.
Make queue with chainable interface from async tasks, then run sequence of tasks
from typing import List, Callable
class QueueTask:
task: Callable
_args: tuple = tuple()
_kwargs: dict = dict()
def __init__(self, task: Callable):
self.task = task
def args(self, *args, **kwargs):
self._args = args
self._kwargs = kwargs
return self
async def run(self):
await self.task(*self._args, **self._kwargs)
class QueueRunner:
queue: List[QueueTask] = []
def task(self, task: Callable):
self.queue.append(QueueTask(task))
return self
def args(self, *args, **kwargs):
self.queue[-1].args(*args, **kwargs)
return self
async def run(self):
for task in self.queue:
await task.run()
import asyncio
import random
from services.QueueRunner import QueueRunner, QueueTask
async def task(val):
sleep = random.uniform(0.05, 1.0)
print(f'{val} sleeping for {sleep:.2f} seconds')
await asyncio.sleep(sleep)
print(f'{val} woke up')
async def main():
queue = QueueRunner()
for i in range(10):
queue.task(task).args(i)
await queue.run()
asyncio.run(main())
@websmithcode
Copy link
Author

Subscribe to my telegram channel, don’t miss new interesting solutions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment