我想用一组类别执行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同时调用一个函数。在
但是在我运行脚本之后,它得到了一个This event loop is already running
错误,我发现这是因为我在内部和外部函数中调用了loop.run_until_complete()
。在
但是,当我去掉run_until_complete()
,在main()
中调用f()
,函数调用立即完成,它不能等待内部函数完成。因此在main()
中调用循环是不可避免的。但我认为它与内部函数不相容,内部函数也必须调用它。在
如何处理问题并运行循环?最初的代码都在同一个main()
中,并且工作正常,但是如果可能的话,我想让它更干净。在
将
main()
转换为异步函数并由loop.run_until_complete()
执行。在当代码只有一个
run_until_complete()
时,一切都变得简单多了。在Python3.7中,您将能够只编写asyncio.run(main())
循环已在运行。你不需要(也不能)再次运行它。在
你等错了。
loop.run_until_complete
不返回您可以等待的内容(aFuture
);它返回在完成之前正在运行的任何内容的结果。在{{cdio>当你调用asyncd3}时,它就不发生了。因此,它返回一个必须用事件循环计划的future。在运行的事件循环告诉它之前,它不会执行。
loop.run_until_complete
会帮你解决所有这些问题。在要结束您的问题,您需要等待
^{pr2}$asyncio.gather
。在您可能还希望在
f
的末尾包含return result
。在相关问题 更多 >
编程相关推荐