Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有类似于使用contextmanager的Python方式在后台运行异步任务?_Python_Async Await_Python Asyncio_Contextmanager - Fatal编程技术网

是否有类似于使用contextmanager的Python方式在后台运行异步任务?

是否有类似于使用contextmanager的Python方式在后台运行异步任务?,python,async-await,python-asyncio,contextmanager,Python,Async Await,Python Asyncio,Contextmanager,最近,我想在后台运行一些异步任务,同时运行其他任务,但我认为代码不够Pythonic: task = asyncio.create_task(long_task()) await short_task() await task 所以我把它做得更像蟒蛇了: @asynccontextmanager async def run_in_background(coro): task = asyncio.create_task(coro) yield task await tas

最近,我想在后台运行一些异步任务,同时运行其他任务,但我认为代码不够Pythonic:

task = asyncio.create_task(long_task())
await short_task()
await task
所以我把它做得更像蟒蛇了:

@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

这样的事情已经存在了吗

目前没有,但这是一个非常有用的想法。Python3.8将添加一个更通用的概念版本,这是一个未来的Python版本,其形式是受和中现有技术启发的类

我建议加强实现,最终使用
,保证即使出现异常情况,也会等待后台任务;例如:

@asynccontextmanager
async def run_in_background(coro):
    task = asyncio.create_task(coro)
    try:
        yield task
    finally:
        await task
如果不是的话,这是被认为比现有的方式更具Pythonic还是更少Pythonic

问题的这一部分显然是基于观点的,但我要说的是,上下文管理器更像python,因为它确保后台任务在块离开时完成并等待。它还可以确保后台任务中的异常,这是异步IO代码中常见的错误源。

提供了一种更好的方法来处理托儿所对象:

async with trio.open_nursery() as nursery:
    nursery.start_soon(long_task())  # Task will run in background

    await short_task()
    # Wait for background tasks to finish

拿一些短而有效的东西,然后转换成更大、更复杂的东西,这绝对不是一种蟒蛇式的行为。@Keith,它是如何变得更大、更复杂的呢?2行对3。@Keith这与使用
打开(“文件”)
vs
文件相同。打开
文件。关闭
@Keith是的,但这就是实现,我写了一次,然后可以在任何地方使用它。如果有这样的现有方法,我就不需要编写新函数。你似乎没有抓住我问题的重点。这只是一个一般性的观察。这个问题实际上是模糊的,因为“Pythonic”也有点主观,并且您实际上并没有在异步框架中“在后台”运行任务。这只是事件循环的一部分,可能会阻止它。谢谢!等不及python 3.8了!