
只有进入 PENDING 状态下的任务才可以取消c 异步编程,FINISHED状态不可以取消。。。。。。。
使用 KeyboardInterrupt 来接收终止事件

import asyncio
async def work(id, t):
print('Working...')
await asyncio.sleep(t)
print('Work {} done'.format(id))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
coroutines = [work(i, i) for i in range(1, 4)]
try:
loop.run_until_complete(asyncio.gather(*coroutines))
except KeyboardInterrupt: # 接收终端事件,结束事件循环中全部的pending任务
loop.stop()
finally:
loop.close()
在任务执行过程中 ctrl+c,直接更改还未完成的任务

Working...
Working...
Working...
Work 1 done
Work 2 done
^C
通过 asyncio.Task.all_tasks 获取全部任务并获取它们的状况
import asyncio
async def work(id, t):
print('Working...')
await asyncio.sleep(t)
print('Work {} done'.format(id))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
coroutines = [work(i, i) for i in range(1, 4)]
try:
loop.run_until_complete(asyncio.gather(*coroutines))
except KeyboardInterrupt:
tasks = asyncio.Task.all_tasks()
for i in tasks:
print('取消任务:{}'.format(i._state))
print('取消状态:{}'.format(i.cancel()))
finally:
loop.close()
效果如下c 异步编程,在执行过程中输入 ctrl+c

Working...
Working...
Working...
Work 1 done
^C取消任务:PENDING
取消状态:True
取消任务:FINISHED
取消状态:False
取消任务:PENDING
取消状态:True
asyncio的eventloop提供了一系列函数来处理异步函数执行的难题
下面是一个整合的反例
import asyncio
import functools
def normal_func(name: str):
print('[normal_func] triggered by {}'.format(name))
def loop_stop(loop: asyncio.AbstractEventLoop, future: asyncio.Future):
loop.stop()
async def work(t: int, name: str):
print('[{}] start'.format(name))
await asyncio.sleep(t)
print('[{}] after {}s stop'.format(name, t))
if __name__ == '__main__':
# asyncio.ensure_future
# loop.create_Task
# loop.run_until_complete
loop = asyncio.get_event_loop()
start = loop.time()
tasks = asyncio.gather(work(1, '1'), work(4, '2'))
loop.call_soon(normal_func, 'call_soon')
loop.call_later(2, normal_func, 'call_later')
loop.call_at(start + 3, normal_func, 'call_at')
tasks.add_done_callback(functools.partial(loop_stop, loop))
loop.run_forever() # 无限运行事件循环,直至 loop.stop 停止
loop.close() # 关闭事件循环,只有 loop 处于停止状态才会执行
结果如下
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-120305-1.html
77个粉丝
追求的不就是一种不平凡嘛