问一个关于 asyncio 的问题,当多个 task 运行,其中一个正确返回后,怎么取消其他协程?

2021-01-22 10:33:25 +08:00
 dongcheng

一个简单例子 import asyncio import time

特殊函数

async def get_request(url): print('正在下载',url) # time.sleep(2) 不支持异步的模块 会中断整个的异步效果 await asyncio.sleep(2) print('下载完成',url) return 'page_text'

def parse(task): print(task.result())

start = time.time() urls = ['www.xxx1.com','www.xxx2.com','www.xxx3.com']

tasks = [] #存放多任务 for url in urls: # 调用特殊函数 func = get_request(url)

# 创建任务对象
task = asyncio.ensure_future(func)

# 给任务对象绑定回调函数
task.add_done_callback(parse)
tasks.append(task)

创建事件循环对象

loop = asyncio.get_event_loop()

执行任务

loop.run_until_complete(asyncio.wait(tasks)) print('总耗时:',time.time()-start) #2.0015313625335693

可以在 get_request 判断任务是否成功,但是如何判断成功之后取消其他任务呢?

谢谢

2640 次点击
所在节点    Python
23 条回复
zeroDev
2021-01-22 14:30:44 +08:00
用协程里的 active 来判断
zeroDev
2021-01-22 14:31:59 +08:00
另外,我感觉对于你这个需求,不应该进行并发请求。
muzuiget
2021-01-22 14:38:17 +08:00
老生常谈,从外部取消相当于强杀进程,好容易造成数据一致性问题。

正确姿势就是线程 /协程自己在某些关键点判断某个共享变量状态,然后自己优雅退出。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747295

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX