【发布时间】:2018-01-27 18:52:27
【问题描述】:
考虑这个程序,其中主循环和停止它的协程实际上是由我正在使用的库实现的。
import asyncio
import signal
running = True
async def stop():
global running
print("setting false")
running = False
await asyncio.sleep(3)
print("reached end")
async def mainloop():
while running:
print("loop")
await asyncio.sleep(1)
def handle_signal():
loop.create_task(stop())
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, handle_signal)
loop.run_until_complete(mainloop())
loop.close()
当程序收到信号时,我需要调用停止协程来停止主循环。虽然在使用asyncio.BaseEventLoop.create_task 调度停止协程时,它首先停止了停止事件循环的主循环,并且停止协程无法完成:
$ ./test.py
loop
loop
loop
^Csetting false
Task was destroyed but it is pending!
task: <Task pending coro=<stop() done, defined at ./test.py:7> wait_for=<Future pending cb=[Task._wakeup()]>>
如何将协程添加到正在运行的事件循环中,同时让事件循环等待完成?
【问题讨论】:
标签: python python-asyncio coroutine