python - Python 中池的使用

标签 python pool python-multiprocessing

我对使用 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()

一般说明

  1. 您通常应该包含 minimal, complete, verifiable example 。你的例子无法运行。更糟糕的是,它包含大量无关的特定于域的代码(例如 PVDynamics),这会阻止其他人尝试运行您的示例。

  2. 说明观察到的代码行为(例如错误的输出、运行时错误等)以及所需的行为。

  3. Pool 导入为 ThreadPool 会令人困惑,因为线程和进程是 different并且具有非常相似的 API。

关于python - Python 中池的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751582/

相关文章:

python - EMR Pyspark作业,如何在s3中导入python库

java - 字符串池 : "Te" +"st" faster than "Test"?

python - 将 dask delayed 与函数返回列表一起使用

python - Django将进度保存到下标的Session中

python - 如何在不处于顶层的情况下解决python多处理的 pickle 错误?

python - 在Python中,尝试将整数转换为字符并放入二进制 "string"

python - 在 AUI 托管框架中的 Pane 之间移动

Java Spring ThreadPoolExecutorFactoryBean

Python 多处理。池和内存

python - 在python中将另一个项目作为模块导入