Return 使用 joblib 将结果发送给父进程
Return results to parent process using joblib
我是运行一个函数,需要一段时间才能计算16次。然而,所有这些运行都是相互独立的。因此我决定使用 joblib 来加速它。
Joblib 正常工作并加快了速度,但我正在努力解决一个问题 - 如何正确 return 评估值?我想将 16 个结果保存到内存中,最好是保存到列表中。但是,使用全局变量似乎不是一个选项,因为新的 Python 进程不使用父进程使用的全局变量。根据 joblib 文档,Parallel 的 max_nbytes 参数设置了要共享的数组大小的阈值,但我对子进程函数中的 16 个整数列表所做的所有更改对父进程中的列表没有影响。
唯一的选择是将计算值保存到文件中,然后使用父进程检索它们,还是有其他选择?
如果您确实需要 joblib,可以将结果放入 Queue
并在最后检索结果。
from multiprocessing documentation:
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
您也可以使用 multiprocessing.Pool
,它的作用就是:(from multiprocessing documentation)
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
将打印到标准输出:
[1, 4, 9]
我是运行一个函数,需要一段时间才能计算16次。然而,所有这些运行都是相互独立的。因此我决定使用 joblib 来加速它。
Joblib 正常工作并加快了速度,但我正在努力解决一个问题 - 如何正确 return 评估值?我想将 16 个结果保存到内存中,最好是保存到列表中。但是,使用全局变量似乎不是一个选项,因为新的 Python 进程不使用父进程使用的全局变量。根据 joblib 文档,Parallel 的 max_nbytes 参数设置了要共享的数组大小的阈值,但我对子进程函数中的 16 个整数列表所做的所有更改对父进程中的列表没有影响。
唯一的选择是将计算值保存到文件中,然后使用父进程检索它们,还是有其他选择?
如果您确实需要 joblib,可以将结果放入 Queue
并在最后检索结果。
from multiprocessing documentation:
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
您也可以使用 multiprocessing.Pool
,它的作用就是:(from multiprocessing documentation)
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
将打印到标准输出:
[1, 4, 9]