asyncio是否已经在运行一个嵌套的事件循环?

2024-04-24 10:34:53 发布

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

我想用一组类别执行web抓取,每个类别也有一个url列表。所以我决定只根据main函数中的每个类别调用一个函数,在内部函数中有一个非阻塞调用。在

代码如下:

def main():
    loop = asyncio.get_event_loop()
    b = loop.create_task(f("p", all_p_list))
    f = loop.create_task(f("f", all_f_list))

    loop.run_until_complete(asyncio.gather(p, f))

它应该同时执行f函数。在

但是f函数也必须运行循环,因为在该函数中,它基于每个URL同时调用一个函数。在

^{pr2}$

但是在我运行脚本之后,它得到了一个This event loop is already running错误,我发现这是因为我在内部和外部函数中调用了loop.run_until_complete()。在

但是,当我去掉run_until_complete(),在main()中调用f(),函数调用立即完成,它不能等待内部函数完成。因此在main()中调用循环是不可避免的。但我认为它与内部函数不相容,内部函数也必须调用它。在

如何处理问题并运行循环?最初的代码都在同一个main()中,并且工作正常,但是如果可能的话,我想让它更干净。在


Tags: 函数run代码loopeventwebasynciotask
2条回答

main()转换为异步函数并由loop.run_until_complete()执行。在

当代码只有一个run_until_complete()时,一切都变得简单多了。在Python3.7中,您将能够只编写asyncio.run(main())

How can I deal with the problem and run the loop?

循环已在运行。你不需要(也不能)再次运行它。在

result = await loop.run_until_complete(asyncio.gather(*soups_coro))

你等错了。loop.run_until_complete不返回您可以等待的内容(aFuture);它返回在完成之前正在运行的任何内容的结果。在

{{cdio>当你调用asyncd3}时,它就不发生了。因此,它返回一个必须用事件循环计划的future。在运行的事件循环告诉它之前,它不会执行。loop.run_until_complete会帮你解决所有这些问题。在

要结束您的问题,您需要等待asyncio.gather。在

^{pr2}$

您可能还希望在f的末尾包含return result。在

相关问题 更多 >