python 协程之asyncio (四)

协程停止

future对象,也就是协程对象有4种状态。

  • Pending:未执行
  • Running:正在执行
  • Done:执行完毕
  • Cancelled:停止

停止协程就是将状态修改为Cancelled,这就用到了asyncio.Tasks以获取事件循环的任务。

要停止事件循环,需要先取消task,然后停止协程,切记在停止之后还要开启,不然会抛出异常。

import asyncio,time
async def wait(name,hour):
    print ('%s 等待%d秒'%(name,hour))
    await asyncio.sleep(hour)
    print( '%s 执行完成 '%name)
if __name__=='__main__':
    now=lambda:time.time()
    name_list=['jack', 'tom', 'mary', 'susan']
    #创建协程对象
    corouttine_list=[]
    for i in range((len(name_list))):
        corouttine_list.append(wait(name_list[i],hour=i+1))
    # 创建任务对象
    task_list=[]
    for i in corouttine_list:
        task_list.append(asyncio.ensure_future(i))
    start=now()
    loop=asyncio.get_event_loop()
    try:
        loop.run_until_complete(asyncio.wait(task_list))
    except KeyboardInterrupt as err:
        #获取事件循环中所有的任务列表:
        for task in asyncio.Task.all_tasks():
            print(task.cancel())
        loop.stop()
        loop.run_forever()
    finally:
        loop.close()
    print('耗时: %0.3f' % (now() - start))

 

 

 这里再jack执行完成的时候强行中止,所以后边取消的时候返回False。

 

posted @ 2021-10-25 14:15  瘦阿瘦  阅读(104)  评论(0编辑  收藏  举报