Tôi có một vòng lặp sự kiện chạy một số đồng tác vụ như một phần của công cụ dòng lệnh. Người dùng có thể làm gián đoạn công cụ bằng thông thường Ctrl + C, tại thời điểm đó tôi muốn xóa sạch chính xác sau vòng lặp sự kiện bị gián đoạn.Cách chính xác để dọn sạch sau vòng lặp sự kiện bị gián đoạn là gì?
Đây là những gì tôi đã thử.
import asyncio
@asyncio.coroutine
def shleepy_time(seconds):
print("Shleeping for {s} seconds...".format(s=seconds))
yield from asyncio.sleep(seconds)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# Side note: Apparently, async() will be deprecated in 3.4.4.
# See: https://docs.python.org/3.4/library/asyncio-task.html#asyncio.async
tasks = [
asyncio.async(shleepy_time(seconds=5)),
asyncio.async(shleepy_time(seconds=10))
]
try:
loop.run_until_complete(asyncio.gather(*tasks))
except KeyboardInterrupt as e:
print("Caught keyboard interrupt. Canceling tasks...")
# This doesn't seem to be the correct solution.
for t in tasks:
t.cancel()
finally:
loop.close()
Chạy này và nhấn Ctrl + C sản lượng:
$ python3 asyncio-keyboardinterrupt-example.py
Shleeping for 5 seconds...
Shleeping for 10 seconds...
^CCaught keyboard interrupt. Canceling tasks...
Task was destroyed but it is pending!
task: <Task pending coro=<shleepy_time() running at asyncio-keyboardinterrupt-example.py:7> wait_for=<Future cancelled> cb=[gather.<locals>._done_callback(1)() at /usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/tasks.py:587]>
Task was destroyed but it is pending!
task: <Task pending coro=<shleepy_time() running at asyncio-keyboardinterrupt-example.py:7> wait_for=<Future cancelled> cb=[gather.<locals>._done_callback(0)() at /usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/tasks.py:587]>
Rõ ràng, tôi không dọn dẹp một cách chính xác. Tôi nghĩ có lẽ gọi cancel()
về các nhiệm vụ sẽ là cách để làm điều đó.
Cách chính xác để làm sạch sau vòng lặp sự kiện bị gián đoạn là gì?
Trong trường hợp quan trọng, tôi đang chạy Python 3.4.3 trên OS X 10.10.3. –