tôi có một chương trình/Python asyncio với hai nhiệm vụ asyncio:Python asyncio chương trình sẽ không thoát khỏi
- một mà treo
- một mà đi vào mãi mãi.
Tôi muốn toàn bộ chương trình của mình thoát sau lần gặp đầu tiên. Tôi không thể làm cho nó xảy ra.
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()
Nó in ERROR nhưng không thoát. Khi đóng bằng tay, chương trình in stack trace sau:
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
Bạn đã thử hợp tác thoát? Có lẽ không phải những gì bạn muốn, nhưng ít nhất là một thử nghiệm, bạn có thể: thay đổi vòng lặp trong 'infinite_while' để nói' while not exit_requested'; thay đổi 'task_1' để bắt ngoại lệ khẳng định, thiết lập cờ và reraise; và xem cuộc gọi của bạn để thoát() có hoàn thành sau khi mỗi tác vụ đã thoát, một bình thường và một với ngoại lệ khẳng định. –
Cảm ơn, nó hoạt động, sẽ sử dụng nó như một phương sách cuối cùng nhưng hy vọng có một cách sạch hơn để giải quyết nó. – MrJ