我对使用 Python 进行多处理还很陌生,我正在尝试了解如何正确使用 Pool。我有一些代码,如下所示:
import numpy as np
from multiprocessing.dummy import Pool as ThreadPool
...
pool = ThreadPool(15)
arb = np.arange(0,len(np.concatenate((P,V),axis=0)),1)
F = pool.map(tttt,arb)
pool.close()
pool.join()
NT = 1000
for test in range(0,NT):
(P,V) = Dynamics(P,V,F)
pool = ThreadPool(15)
F = pool.map(tttt,arb)
pool.close()
pool.join()
...
tttt 和 Dynamics 是之前定义的两个函数。我希望使用 Pool 能够使用 tttt 同时计算大量值,但我也想更新用于这些计算的值(tttt 取决于 P 和 V,尽管没有明确表示)。
我是否必须像现在一样创建和关闭池两次,还是可以只创建一次?
最佳答案
简单答案
您似乎希望在 for
循环的每次迭代中使用进程池。您使事情变得比使用 Pool.map
所需的更加复杂,但是您对 .join()
和 .close()
的调用> 建议您宁愿使用Pool.map_async
。这是一个简单的例子:
import numpy as np
from multiprocessing import Pool
from time import sleep
def print_square(x):
sleep(.01)
print x**2
if __name__=='__main__':
for k in range(10):
pool = Pool(3)
arb = np.arange(0,10)
pool.map_async(print_square,arb)
pool.close()
pool.join()
一般说明
您通常应该包含 minimal, complete, verifiable example 。你的例子无法运行。更糟糕的是,它包含大量无关的特定于域的代码(例如
P
、V
、Dynamics
),这会阻止其他人尝试运行您的示例。说明观察到的代码行为(例如错误的输出、运行时错误等)以及所需的行为。
将
Pool
导入为ThreadPool
会令人困惑,因为线程和进程是 different并且具有非常相似的 API。
关于python - Python 中池的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751582/