为什么 loop.run_forever() 锁定了我的主线程?
Why loop.run_forever() is locking my main thread?
在学习 asyncio 时,我正在尝试这段代码:
import asyncio
from asyncio.coroutines import coroutine
@coroutine
def coro():
counter: int = 0
while True:
print("Executed" + str(counter))
counter += 1
yield
loop = asyncio.get_event_loop()
loop.run_until_complete(coro())
loop.run_forever()
print("Finished!")
我原以为协程只执行一次,因为它包含 yield 并且应该将控制权返回给调用者。我期待的输出是:
Executed 0
Finished!
我期待这种行为,因为我认为循环将永远 运行 协同程序,每次 "frame" 在每次执行后返回调用者(类似于后台线程,但在合作中方法)。但是相反,它 运行 永远是协程而不返回?。输出如下:
Executed 0
Executed 1
Executed 2
Executed 3
...
谁能解释为什么会发生这种情况而不是我的预期?
干杯。
你有几个问题。当您调用 run_until_complete
时,它会等待 coro
完成,然后再继续您的 run_forever
调用。正如您所定义的,coro
永远不会结束。它包含一个无限循环,不执行任何操作以跳出循环。如果您想继续应用程序的下一步,您需要在循环内的某处使用 break
或 return
。
不过,一旦您完成此操作,您的下一个调用就是 run_forever
,正如其名称所暗示的那样,它将永远 运行。在这种情况下,它不会有任何事情要做,因为你没有用事件循环安排任何其他事情。
I was expecting the coroutine to be executed only once because it contains a yield and should have returned control to the caller.
忽略协程没有 yield 的事实,waiting(或 yield from 取决于您选择使用的语法)不会 return 控制 run_until_complete
或 run_forever
。它 return 控制事件循环,以便它可以检查是否有任何其他已等待并准备好恢复的内容。
在学习 asyncio 时,我正在尝试这段代码:
import asyncio
from asyncio.coroutines import coroutine
@coroutine
def coro():
counter: int = 0
while True:
print("Executed" + str(counter))
counter += 1
yield
loop = asyncio.get_event_loop()
loop.run_until_complete(coro())
loop.run_forever()
print("Finished!")
我原以为协程只执行一次,因为它包含 yield 并且应该将控制权返回给调用者。我期待的输出是:
Executed 0
Finished!
我期待这种行为,因为我认为循环将永远 运行 协同程序,每次 "frame" 在每次执行后返回调用者(类似于后台线程,但在合作中方法)。但是相反,它 运行 永远是协程而不返回?。输出如下:
Executed 0
Executed 1
Executed 2
Executed 3
...
谁能解释为什么会发生这种情况而不是我的预期?
干杯。
你有几个问题。当您调用 run_until_complete
时,它会等待 coro
完成,然后再继续您的 run_forever
调用。正如您所定义的,coro
永远不会结束。它包含一个无限循环,不执行任何操作以跳出循环。如果您想继续应用程序的下一步,您需要在循环内的某处使用 break
或 return
。
不过,一旦您完成此操作,您的下一个调用就是 run_forever
,正如其名称所暗示的那样,它将永远 运行。在这种情况下,它不会有任何事情要做,因为你没有用事件循环安排任何其他事情。
I was expecting the coroutine to be executed only once because it contains a yield and should have returned control to the caller.
忽略协程没有 yield 的事实,waiting(或 yield from 取决于您选择使用的语法)不会 return 控制 run_until_complete
或 run_forever
。它 return 控制事件循环,以便它可以检查是否有任何其他已等待并准备好恢复的内容。