Python asyncio如何创建任务列表并在事件循环中使用它?

2024-05-17 00:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python异步IO不是很有经验,尽管同步Python进展顺利。 我有一个函数,它创建一个任务列表,还有另一个函数,该函数将与此列表中的任务一起调用:

import asyncio

async def createTasks(some_dict):
    coroutines = []
    # some_dict can have an arbitrary number of items
    for item in some_dict:
        coroutines.append(executeOneTask(item))
    tasks = await asyncio.gather(*coroutines, return_exceptions=True)
    return tasks

async def executeOneTask(item):
    # execute a task asynchronously
    return

在这里,如果我错了,你可以自由地纠正我

现在,我对asyncio的理解是,我需要一个事件循环来执行一个异步函数,这意味着asyncio.gather我需要await,这意味着这需要在async函数内部发生。好的,我需要一个事件循环来创建我想要异步执行的异步任务列表

如果我对事件循环的理解是正确的,我就不能轻松地将事件循环中的任务添加到同一个事件循环中。让我们假设我有一个异步main()函数,它应该首先使用createTasks()检索异步任务的列表,然后使用executeOneTask()创建要运行的异步任务量(等于列表长度)

我应该如何构造这样一个main()函数?我需要多个事件循环吗?我是否可以通过其他方式创建任务列表,以实现更简单的代码

旁注:我在这里设置的方法可能是解决问题的非常困难或颠倒的方法。我的目标是创建一个异步任务列表,然后异步运行这些任务。如果智能解决方案需要,请不要遵循上面的代码结构

谢谢


Tags: 函数asyncio列表asyncreturndef事件some
1条回答
网友
1楼 · 发布于 2024-05-17 00:17:32

您应该在整个应用程序中只使用一个事件循环。通过asyncio.run(main())启动主函数,asyncio为您创建一个循环。在Python3.8中,您很少需要直接访问或使用循环,但在旧版本中,如果使用循环方法或某些需要循环参数的函数,则可以通过asyncio.get_event_loop()获得循环

请注意,IPython(在Spyder和Jupyter中使用)也运行自己的循环,因此在这些循环中,您可以直接调用和await,而无需调用asyncio.run

如果您只希望进行异步编程,但不特别需要使用asyncio,我建议您检查一下https://trio.readthedocs.io/,它基本上做相同的事情,但使用起来非常简单(正确)

相关问题 更多 >