管理异步任务

时间:2019-08-24 08:33:31

标签: python-asyncio

我需要一些asyncio的任务管理器。 用于创建任务的包装器:

    def create_task(self,
                    coro: Coroutine[Any, Any, Any],
                    timeout: Optional[int] = None) -> str:
    task_uuid = uuid()
    task = asyncio.create_task(
        asyncio.wait_for(coro, timeout)
    )
    return task.uuid

但是我必须知道任务何时完成,并将有关该任务的信息写入Redis。 我看到两个变体:

  1. 使用add_done_callback,但在这种情况下,我应该不传递异步函数。但是redis客户端是异步的。所以:
def task_done(self, task: asyncio.Task) -> 
    async def write_to_redis(params: dict) -> None:
        redis.write(...)  
    asyncio.create_task(write_to_redis)
  1. 将包装器用于coro:
    def create_task(self,
                     coro: Coroutine[Any, Any, Any],
                     timeout: Optional[int] = None) -> LTaskUuid:
        async def wrapper():
            try:
                await coro()
            finally:
                await redis.write(...)
        asyncio.create_task(
            asyncio.wait_for(wrapper(), timeout)
        )
        return task.uuid

哪种方法更好?也许还有另一种解决方案?

0 个答案:

没有答案