【发布时间】:2017-05-15 21:33:02
【问题描述】:
基于excellent SO answer,我可以让多个任务在 RxPy 中并行工作,我的问题是如何等待它们全部完成?我知道使用线程我可以做到.join(),但 Rx 调度程序似乎没有任何这样的选项。 .to_blocking() 也无济于事,主线程在所有通知触发并调用完整处理程序之前完成。这是一个例子:
from __future__ import print_function
import os, sys
import time
import random
from rx import Observable
from rx.core import Scheduler
from threading import current_thread
def printthread(val):
print("{}, thread: {}".format(val, current_thread().name))
def intense_calculation(value):
printthread("calc {}".format(value))
time.sleep(random.randint(5, 20) * .1)
return value
if __name__ == "__main__":
Observable.range(1, 3) \
.select_many(lambda i: Observable.start(lambda: intense_calculation(i), scheduler=Scheduler.timeout)) \
.observe_on(Scheduler.event_loop) \
.subscribe(
on_next=lambda x: printthread("on_next: {}".format(x)),
on_completed=lambda: printthread("on_completed"),
on_error=lambda err: printthread("on_error: {}".format(err)))
printthread("\nAll done")
# time.sleep(2)
预期输出
calc 1, thread: Thread-1
calc 2, thread: Thread-2
calc 3, thread: Thread-3
on_next: 2, thread: Thread-4
on_next: 3, thread: Thread-4
on_next: 1, thread: Thread-4
on_completed, thread: Thread-4
All done, thread: MainThread
实际输出
calc 1, thread: Thread-1
calc 2, thread: Thread-2
calc 3, thread: Thread-3
All done, thread: MainThread
取消注释睡眠调用时的实际输出
calc 1, thread: Thread-1
calc 2, thread: Thread-2
calc 3, thread: Thread-3
All done, thread: MainThread
on_next: 2, thread: Thread-4
on_next: 3, thread: Thread-4
on_next: 1, thread: Thread-4
on_completed, thread: Thread-4
【问题讨论】:
标签: python multithreading python-multithreading reactivex rx-py