【发布时间】:2020-06-26 18:30:45
【问题描述】:
我有这段代码来测试 asyncio 是如何工作的:
stop = False
async def subcoro():
# same result even with a range of 30
for i in range(30000):
pass
async def first():
global stop
while not stop:
await subcoro()
# without sleep no signal is triggered
await asyncio.sleep(0.1)
async def main(loop):
coro = asyncio.ensure_future(first())
await asyncio.wait([coro], loop=loop)
def end():
global stop
stop = True
if __name__ == '__main__':
loop = asyncio.get_event_loop()
for signame in ('SIGINT', 'SIGTERM'):
loop.add_signal_handler(getattr(signal, signame), end)
try:
loop.run_until_complete(asyncio.ensure_future(main(loop)))
finally:
loop.close()
print('Bye!')
为什么我必须让first() 休眠一段时间(甚至小于 0.1)才能让程序处理信号?
是否有其他方式可以优雅地关闭所有协程和事件循环?
更新: 在 python-forum.org 上,他们告诉我阅读 PEP-0492,但它没有提供任何解决方案或建议。
更新2: 我的真实应用:https://github.com/FedericoTorsello/Embedded/tree/serialIO
【问题讨论】:
-
您能否在您的问题中为我们提供一个最小、完整且可验证的问题示例,好吗? stackoverflow.com/help/mcve
-
对不起,但链接中的应用程序非常“最小”(连接到 arduino,设置阅读器线程并运行协程)。我发现问题在于调用另一个线程中的函数,该线程从串行中读取数据,而在异步循环中处理得不好。我会尝试切换到实验性的 serial.aio 来弄清楚如何将函数
write_line包装到协程中。
标签: python python-3.x async-await python-asyncio