进程池就是我们将所要运行的东西,放到池子里,Python会自行解决多进程的问题.
Pool
和之前的Process(
https://blog.csdn.net/qq_38742161/article/details/87885424)
的不同点是丢向Pool
的函数有返回值,而Process
的没有返回值。有了池子之后,就可以让池子对应某一个函数,我们向池子里丢数据,池子就会返回函数返回的值。
首先import multiprocessing
和定义job(),注意功能函数有返回值。
import multiprocessing as mp
def job(x):
return x*x
然后我们定义一个Pool
pool = mp.Pool()
接下来用map()
获取结果,在map()
中需要放入函数和需要迭代运算的值,然后它会自动分配给CPU核,返回结果
res = pool.map(job, range(10))
全部程序:
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool = mp.Pool()
res = pool.map(job, range(10))
print(res)
if __name__ == '__main__':
multicore()
运行结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
自定义核数量
我们怎么知道Pool
是否真的调用了多个核呢?我们可以把迭代次数增大些,然后打开CPU负载看下CPU运行情况
打开CPU负载(Mac):活动监视器 > CPU > CPU负载(单击一下即可)
Pool
默认大小是CPU的核数,我们也可以通过在Pool
中传入processes
参数即可自定义需要的核数量,
def multicore():
pool = mp.Pool(processes=3) # 定义CPU核数量为3
res = pool.map(job, range(10))
print(res)
共享内存
多线程计算时,若不同线程直接进行数据交流,只需要把变量设置为全局即可。
在多进程整,只有用共享内存才能让多CPU之间有交流。
Shared Value
我们可以通过使用Value
数据存储在一个共享的内存表中。
import multiprocessing as mp
value1 = mp.Value('i', 0)
value2 = mp.Value('d', 3.14)
其中d
和i
参数用来设置数据类型的,d
表示一个双精浮点类型,i
表示一个带符号的整型。
Shared Array
在Python的mutiprocessing
中,有还有一个Array
类,可以和共享内存交互,来实现在进程之间共享数据。
array = mp.Array('i', [1, 2, 3, 4])
这里的Array
和numpy中的不同,它只能是一维的,不能是多维的。同样和Value
一样,需要定义数据形式,否则会报错。 我们会在后一节举例说明这两种的使用方法.
各参数代表的数据类型
| Type code | C Type | Python Type | Minimum size in bytes |
| --------- | ------------------ | ----------------- | --------------------- |
| `'b'` | signed char | int | 1 |
| `'B'` | unsigned char | int | 1 |
| `'u'` | Py_UNICODE | Unicode character | 2 |
| `'h'` | signed short | int | 2 |
| `'H'` | unsigned short | int | 2 |
| `'i'` | signed int | int | 2 |
| `'I'` | unsigned int | int | 2 |
| `'l'` | signed long | int | 4 |
| `'L'` | unsigned long | int | 4 |
| `'q'` | signed long long | int | 8 |
| `'Q'` | unsigned long long | int | 8 |
| `'f'` | float | float | 4 |
| `'d'` | double | float | 8 |