根据我的实验,我猜想答案是否定的。但是也许通过对futures模块进行一些更改可能是可能的。
我想提交一个工作器,它本身创建一个执行程序并提交工作。我想将第二个future返回给主进程。我有这个MWE,但它不起作用,因为f2
对象在通过多进程发送时可能会与其父执行程序解除关联。(如果两个执行程序都是ThreadPoolExecutor,则可以运行,因为f2
对象永远不会被复制)。
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time
def job1():
try:
ex2 = ThreadPoolExecutor()
time.sleep(2)
f2 = ex2.submit(job2)
finally:
ex2.shutdown(wait=False)
return f2
def job2():
time.sleep(2)
return 'done'
try:
ex1 = ProcessPoolExecutor()
f1 = ex1.submit(job1)
finally:
ex1.shutdown(wait=False)
print('f1 = {!r}'.format(f1))
f2 = f1.result()
print('f1 = {!r}'.format(f1))
print('f2 = {!r}'.format(f2))
我的问题是:是否有安全的方法可以通过多进程管道发送future对象,并在其完成后能够接收该值。似乎我可能需要设置另一个类似于执行程序的结构,以便通过另一个管道监听结果。
concurrent
库不是特别熟悉,但最近我一直在研究Ray。从我对你的问题的理解来看(诚然并不是很好,这也是我没有提交答案的原因之一),如果你愿意超越标准库进行查找,Ray很可能能够解决你的问题。你可以在这里阅读相关信息:https://rise.cs.berkeley.edu/projects/ray/ - PMende