我需要一些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。 我看到两个变体:
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)
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
哪种方法更好?也许还有另一种解决方案?