Python 线程池和并行处理池

Python 线程池和并行处理池,python,multithreading,parallel-processing,pool,Python,Multithreading,Parallel Processing,Pool,有没有一种方法可以在python中同时使用ThreadPool和Pool,通过指定希望使用的CPU和内核的数量来并行化循环 例如,我将有一个循环执行为: from multiprocessing.dummy import Pool as ThreadPool from tqdm import tqdm import numpy as np def my_function(x): return x + 1 pool = ThreadPool(4) my_array = np.aran

有没有一种方法可以在python中同时使用ThreadPool和Pool,通过指定希望使用的CPU和内核的数量来并行化循环

例如,我将有一个循环执行为:

from multiprocessing.dummy import Pool as ThreadPool 
from tqdm import tqdm
import numpy as np

def my_function(x):
    return x + 1

pool = ThreadPool(4)
my_array = np.arange(0,1e6,1)


results = list(tqdm(pool.imap(my_function, my_array),total=len(my_array)))

对于4核,但我也希望将它们分布在多个CPU上,有没有简单的方法来调整代码?

多处理.dummy.Pool
非常简单
ThreadPool
,它不使用多核和多CPU(因为GIL)。您必须使用
multiprocessing.Pool
来运行进程,这是您的操作系统中的进程(如果您定义了Pool(N)-N是这个进程的数量,如果没有-OS中的内核数量是默认值)。此进程从池的内部队列获取的参数。'在这种情况下,U将使用操作系统中的所有cpu和所有内核。dummy.Pool非常简单,它不使用多核和多cpu(因为GIL)。您必须使用
multiprocessing.Pool
来运行进程,这是您的操作系统中的进程(如果您定义了Pool(N)-N是这个进程的数量,如果没有-OS中的内核数量是默认值)。此进程从池的内部队列获取的参数。'在这种情况下,您将使用操作系统中的所有cpu和所有核心,您将混淆核心和cpu。一般来说,出于所有目的,两者都被认为是相同的(从现在起,我们称之为处理器)

在python中创建线程池时,由于python中的全局解释器锁(GIL),线程是用户级线程,并且在同一处理器上运行。因为一次只有一个线程可以控制python解释器。因此,使用(python)线程,我们在数据密集型任务中不会获得任何真正的并发性

如何解决这个问题?容易的。生成在不同处理器上运行的多个python进程(每个进程都有自己的解释器)。这就是使用multi-processing(mp)模块从调用它的父python进程派生多个进程的地方

您可以通过运行htop(在linux、mac上)和分析python进程的数量来验证这一点。对于mp模块,它们都将与调用pool.map函数的父脚本具有相同的名称

  • 8核mac电脑上的代码计时:39.7s
  • 此代码在同一台机器上的计时:2.9s(注意,我最多可以使用8个内核,但为了比较,仅使用4个)
以下是修改后的代码:

from multiprocessing.dummy import Pool as ThreadPool 
from tqdm import tqdm
import numpy as np
import time
import multiprocessing as mp

def my_function(x):
    return x + 1

pool = ThreadPool(4)
my_array = np.arange(0,1e6,1)


t1 = time.time()
# results = list(tqdm(pool.imap(my_function, my_array),total=len(my_array)))
pool = mp.Pool(processes=4) # Generally, set to 2*num_cores you have
res = pool.map(my_function, my_array)
print("Time taken = ", time.time() - t1)

您混淆了内核和CPU。一般来说,出于所有目的,两者都被认为是相同的(从现在起,我们称之为处理器)

在python中创建线程池时,由于python中的全局解释器锁(GIL),线程是用户级线程,并且在同一处理器上运行。因为一次只有一个线程可以控制python解释器。因此,使用(python)线程,我们在数据密集型任务中不会获得任何真正的并发性

如何解决这个问题?容易的。生成在不同处理器上运行的多个python进程(每个进程都有自己的解释器)。这就是使用multi-processing(mp)模块从调用它的父python进程派生多个进程的地方

您可以通过运行htop(在linux、mac上)和分析python进程的数量来验证这一点。对于mp模块,它们都将与调用pool.map函数的父脚本具有相同的名称

  • 8核mac电脑上的代码计时:39.7s
  • 此代码在同一台机器上的计时:2.9s(注意,我最多可以使用8个内核,但为了比较,仅使用4个)
以下是修改后的代码:

from multiprocessing.dummy import Pool as ThreadPool 
from tqdm import tqdm
import numpy as np
import time
import multiprocessing as mp

def my_function(x):
    return x + 1

pool = ThreadPool(4)
my_array = np.arange(0,1e6,1)


t1 = time.time()
# results = list(tqdm(pool.imap(my_function, my_array),total=len(my_array)))
pool = mp.Pool(processes=4) # Generally, set to 2*num_cores you have
res = pool.map(my_function, my_array)
print("Time taken = ", time.time() - t1)

CPU是由内核组成的。我知道,我正在尝试跨多个CPU在多个内核上执行一个进程CPU是由内核组成的。我知道,我正在尝试跨多个CPU在多个内核上执行一个进程如果我使用多处理。池我在多个CPU上分散操作,但当我使用线程池时,它只使用一个CPU。这可能是因为我在一个CPU集群上运行代码,如果我使用多处理器。池,我会在多个CPU上分散操作,但当我使用线程池时,它只使用一个CPU。也许这是因为我在一个CPU集群上运行代码这很有意义,我怀疑因为我试图在一个CPU集群上运行代码,它在多个CPU上生成操作时如何处理多处理有些混乱,但它将在我的单机笔记本上工作这很有意义,我怀疑,因为我试图在CPU集群上运行代码,所以它在多个CPU上生成操作时如何处理多处理存在一些混乱,但它将在我的单机笔记本上工作