1
noli 2018-07-12 14:13:32 +08:00
这种 polling 工作肯定都是库或者框架做的,然而你又没有具体说到底用哪个异步库或者框架。
|
2
creedowl 2018-07-12 14:14:48 +08:00
(换 js,用 promise
|
3
billgreen1 OP @noli 额,tornado,我是因为不想太限制
|
4
v2xe2v 2018-07-12 14:19:19 +08:00
结果入队列,然后轮训?
|
5
noli 2018-07-12 14:24:08 +08:00
@billgreen1
http://www.tornadoweb.org/en/stable/queues.html 4# @v2xe2v 思路是对的,实际上就是把结果入队列,取第一个。只不过这个队列不需要轮询这么费力而已。 |
6
lolizeppelin 2018-07-12 14:31:44 +08:00 via Android
包装一下 返回前 callback
|
7
janxin 2018-07-12 15:04:33 +08:00
你可以选择不用 yield,直接 add_done_callback
|
8
zhuweiyou 2018-07-12 15:13:42 +08:00
结果套同一个 func,判断第一个非 none 的做处理,其它的 abort
|
9
wb14123 2018-07-12 15:39:37 +08:00
所有 future 的结果都扔到一个 BlockingQueue 里面然后从这个里面取
|
11
gjquoiai 2018-07-12 19:43:12 +08:00
我记得 pycon 2018 trio 的作者就讲了这个
|
12
so1n 2018-07-12 20:21:16 +08:00
不知道楼主的意思是不是这样的同时运行多个,然后获取返回的结果,如果是 None 忽略 不是就获取值并结束
task_list = [] done, pending = await asyncio.wait(task_list) for task in done: if task.result() != None: result = task.result() break |
13
andyholo 2018-07-12 21:34:00 +08:00
rxPY 这种需求还是用专门库吧,比自己琢磨方便多了
|
14
billgreen1 OP @so1n 可能是我表述不清楚,其实是这样的:如果第一个返回的是 future3 且结果不为 None,那么我还得等 future1 和 future2。1..n 是有优先级顺序的。当 future i 返回,且有结果时,可以确定的是 i+1 到 n 是可以丢弃了,但是得等 future1 到 future (i-1)的结果
|
15
so1n 2018-07-13 08:39:58 +08:00 via Android
@billgreen1 所以你获取的顺序不是按执行结束时间排序而是按原来排列好的队列?如果是这样的话,简单点直接先遍历队列 put 到 asynico.queue 里面,再依次 get 出来运行,如果运行结果非 none 就不用再 get 直接退出来
|
16
pixcai 2018-07-13 10:23:41 +08:00
官方的 asyncio 已经提供你所需要的 API 了:
asyncio.as_completed(fs, *, loop=None, timeout=None) Return an iterator whose values, when waited for, are Future instances. 上面提到的 asyncio.wait 会等待所有的执行完,asyncio.as_completed 只要有一个执行完就立即返回,例如你要的效果: futures = [future1, future2, future3] for next_completed in asyncio.as_completed(futures): result = await next_completed if result is not None: break 这样在取结果的时候,其它的 future 还在执行,应该就是你要的效果。 |