【发布时间】:2019-02-08 23:17:16
【问题描述】:
最近想在后台运行一些异步任务,同时运行其他任务,但我觉得代码不够Pythonic:
task = asyncio.create_task(long_task())
await short_task()
await task
所以我把它做得更Pythonic:
@asynccontextmanager
async def run_in_background(coro):
task = asyncio.create_task(coro)
yield task
await task
async def main():
async with run_in_background(long_task()):
await short_task()
这样的东西已经存在了吗?如果不是,这被认为比现有方式更 Pythonic 还是更少 Pythonic?
【问题讨论】:
-
采用简短的东西并完成工作并转换为更大和更复杂的东西绝对不是 Pythonic。
-
@Keith 它是如何更大更复杂的? 2 线对 3。
-
@Keith 与使用
with open("file")与file.openfile.close相同。 -
@Keith 是的,但这就是实现,我写了一次,然后我可以在任何地方使用它。如果有这样的现有方式,我不需要编写新函数。好像你错过了我的问题的重点。
-
这只是一个一般性的观察。这个问题实际上是模糊的,因为“Pythonic”也有点主观,并且您实际上并没有在异步框架中“在后台”运行任务。它只是事件循环的一部分,可以阻止它。
标签: python async-await python-asyncio contextmanager