【发布时间】:2017-12-18 21:05:05
【问题描述】:
假设我是 asyncio 的新手。我正在使用 async/await 来并行化我当前的项目,并且我发现自己将所有协程都传递给了asyncio.ensure_future。很多这样的东西:
coroutine = my_async_fn(*args, **kwargs)
task = asyncio.ensure_future(coroutine)
我真正想要的是调用一个异步函数来返回一个正在执行的任务,而不是一个空闲的协程。我创建了一个装饰器来完成我想要做的事情。
def make_task(fn):
def wrapper(*args, **kwargs):
return asyncio.ensure_future(fn(*args, **kwargs))
return wrapper
@make_task
async def my_async_func(*args, **kwargs):
# usually making a request of some sort
pass
asyncio 是否有一种我无法找到的内置方法?如果我一开始就导致这个问题,我是否使用了错误的 asyncio?
【问题讨论】:
-
你的装饰器包装被阻塞了。 'def wrapper' 应该是 'async def wrapper' 以不阻塞
-
我可能不明白。自从我用 Python 做很多事情以来已经有一段时间了。但我想我想同步创建一个异步任务。如果我做到了
async def wrapper,我的包装函数不会创建一个在执行时会创建任务的协程吗? -
完全正确,所以也许我错过了理解你的意思......我发现你的问题是完全按照你所说的去做,所以我不得不在我的包装器前面添加异步字案子。无论如何,出于您的问题目的,没有“异步”语法就是这样!
标签: python python-3.x python-3.6 python-asyncio