【发布时间】:2023-08-26 11:19:01
【问题描述】:
在阅读了AsyncIO 上的许多文档和文章后,我仍然找不到答案:异步运行函数(不使用线程)并确保调用此异步函数的函数继续执行执行。
伪代码:
async def functionAsync(p):
#...
#perform intensive calculations
#...
print ("Async loop done")
def functionNormal():
p = ""
functionAsync(p)
return ("Main loop ended")
print ("Start Code")
print functionNormal()
预期输出:
Start code
Main loop ended
Async loop done
使用loop.run_until_complete 的搜索示例,但不会返回functionNormal() 的打印值,因为它本质上是阻塞的。
【问题讨论】:
-
如果它应该“不使用线程”运行,您希望它如何工作?或者,您是说 实现 可以在后台使用线程,但您不想显式创建线程?
-
是的,这就是我的意思。明确地我不想创建一个线程。如果它在引擎盖下完成它很好(据我所知,它可能不是,根据我的阅读并发并不总是意味着一个新线程。)
-
并发并不总是意味着一个新线程如果您对所有代码都使用协程 (
async def)。但是您的要求是同步功能与异步代码同时执行,这肯定需要多个线程或纤程。 -
如果我没记错的话,异步代码也可以在新的事件循环中启动。 loop =
asyncio.new_event_loop()..是的,你是对的,同步代码应该继续运行并转到下一行代码,如示例所示。 -
new_event_loop只分配一个事件循环。要在其中实际运行异步代码,您必须使用run_until_complete或run_forever,它们会阻塞当前线程——因此您需要一个额外的线程来同时运行同步代码和异步代码。没有线程它永远不会工作。
标签: python-3.x asynchronous python-asyncio