【发布时间】:2016-09-14 00:34:38
【问题描述】:
我有一个带有两个异步任务的 asyncio/Python 程序:
- 一个崩溃的
- 永远持续下去。
我希望我的整个程序在第一次崩溃后退出。我不能让它发生。
import asyncio
import time
def infinite_while():
while True:
time.sleep(1)
async def task_1():
await asyncio.sleep(1)
assert False
async def task_2():
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, lambda: infinite_while())
loop = asyncio.get_event_loop()
asyncio.set_event_loop(loop)
tasks = asyncio.gather(task_2(), task_1())
try:
loop.run_until_complete(tasks)
except (Exception, KeyboardInterrupt) as e:
print('ERROR', str(e))
exit()
它打印错误但不退出。手动关闭时,程序会打印以下堆栈跟踪:
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 39, in _python_exit
t.join()
File "/usr/lib/python3.5/threading.py", line 1054, in join
self._wait_for_tstate_lock()
File "/usr/lib/python3.5/threading.py", line 1070, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt
【问题讨论】:
-
您尝试过合作退出吗?可能不是您想要的,但至少作为一个实验,您可以:将
infinite_while中的循环更改为while not exit_requested;更改task_1以捕获断言异常,设置标志并重新引发;看看你对 exit() 的调用是否在每个任务退出后完成,一个是正常的,一个是断言异常的。 -
谢谢,它有效,将使用它作为最后的手段,但希望有一种更清洁的方法来解决它。
标签: python python-asyncio