python模块推荐[]multiprocessing-Pool多核批处理

场景

作业是独立的,且每个作业都比较耗时,但是数量非常多。这时候使用多核进行计算作业能显著提高效率。
有点类似大家一起干。如果是普通的单核处理的话,就类似于 一人干活,其他人休息,当然慢。

单核处理任务

比如 60次特殊的加法,每个加法之前先休息1s,增加这个任务的时间,
你可以根据自己的需求定义任务函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from random import random
import time
def task():
time.sleep(1)
a = random()
b = random()
return a+b
start = time.time()
# range(100000000)
for i in range(60):
task()
end = time.time()
span= end-start
print("it take %s seconds"%span)

输出:

1
it take 60.1150267124176 seconds

多核处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from multiprocessing import Pool
from random import random
import time
def task(x):
a = random()
b = random()
return a+b
start = time.time()
pool = Pool() # Create a multiprocessing Pool
data_inputs = range(10**9)
pool.map(task, data_inputs) # process data_inputs iterable with pool
end = time.time()
span= end-start
print("it take %s seconds"%span)

输出:

1
it take 2.5520200729370117 seconds

同样的任务,在48核电脑上只需要2.5秒就能完成。

我们可以看到使用多核处理能显著地加快耗时任务的快速完成。

如果任务耗时很短,则使用多核效果不明显。

比例比如执行一次普通加法,大约耗时7us,时间非常快,而你分配给核的时间可能和任务的时间差不多,这时候采用多核效果就不好。

示例1: 单核普通加法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from random import random
import time
def task():
# time.sleep(1)
a = random()
b = random()
return a+b
start = time.time()
# range(100000000)
for i in range(10**7):
task()
end = time.time()
span= end-start
print("it take %s seconds"%span)

输出:

1
it take 2.497889518737793 seconds

示例2: 多核普通加法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from multiprocessing import Pool
from random import random
import time
def task(x):
# time.sleep(1)
a = random()
b = random()
return a+b
start = time.time()
pool = Pool() # Create a multiprocessing Pool
data_inputs = range(10**7)
pool.map(task, data_inputs) # process data_inputs iterable with pool
end = time.time()
span= end-start
print("it take %s seconds"%span)

输出:

1
it take 3.088542938232422 seconds

我们可以看到同样的任务,多核的完成需要的时间反而比单核多。
对于时间非常短的任务,不适合多核做。

这和实现生活中的情形也比较相似,对于大的项目,领导统筹协调各方资源能够加快项目的完成。
对于小的项目,交给一个人负责就可以了。

如果task 中需要接受多个参数可通过[[],[]]数据结构进行封装示例

task(1,2) task(1,3) task(2,10)等作业

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from multiprocessing import Pool
from random import random
import time
def task(x):
time.sleep(1)
a = x[0]
b = x[1]
return a+b
start = time.time()
pool = Pool() # Create a multiprocessing Pool
a = range(100)
b = range(100)

data_inputs =zip(a,b)
pool.map(task, data_inputs) # process data_inputs iterable with pool
end = time.time()
span= end-start
print("it take %s seconds"%span)

输出:

1
it take 3.7886974811553955 seconds

其他事项

  • process参数来指定使用的核的数目,默认是电脑最大核的数目,Pool(processes = 3)