在实现信号处理程序的函数中,不能直接设置 asyncio.Event 实例的状态,必须通过调用 asyncio.ensure_future() 来执行协程,并在协程中设置 Event 的状态。以下是一个示例:
import asyncio
import signal
loop = asyncio.get_event_loop()
evt = asyncio.Event()
async def do_work():
print("Starting work ...")
await asyncio.sleep(3)
print("Work finished.")
evt.set()
async def signal_handler():
print("Received signal, stopping tasks ...")
task = asyncio.ensure_future(do_work())
await evt.wait()
task.cancel()
print("All tasks stopped.")
loop.stop()
async def main():
# Register the signal handler
loop.add_signal_handler(signal.SIGINT, lambda: asyncio.ensure_future(signal_handler()))
# Start main work
await asyncio.gather(do_work())
if __name__ == "__main__":
loop.run_until_complete(main())
在上面的示例中,signal_handler() 函数是信号处理程序,它会调用 asyncio.ensure_future() 来启动协程 do_work(),并在协程中设置 Event 的状态。当 Event 的状态被设置后,signal_handler() 会取消任务并关闭事件循环。