python多进程的pool的apply和apply_async用法

pool的apply和apply_async用法示例

为什么用python的多进程

python的线程会有线程琐,只能利用一个核,所以我们为了提高效率使用python多进程

apply示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def work(x):
print("{}------{}".format(x, os.getpid()))
time.sleep(3)
print('end')


if __name__ == '__main__':
p = Pool(4) # start 4 worker processes


for i in range(10):
p.apply(work, args=(i,))
print('done')
p.close() # 关闭pool,不接受新任务
p.join() # 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用

apply是阻塞的,每次执行完成才会执行下一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 0------22548
# 1------21116
# 2------23740
# 3------5788
# end
# 4------22548
# end
# 5------21116
# end
# 6------23740
# end
# 7------5788
# end
# 8------22548
# end
# 9------21116
# end
# end
# end
# end

总结:效率比较低

apply_async

apply_async是异步的,非阻塞的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def work(x):
print("{}------{}".format(x, os.getpid()))
time.sleep(3)
print('end')


if __name__ == '__main__':
p = Pool(4) # start 4 worker processes


for i in range(10):

p.apply_async(work, args=(i,)) # 异步高效
print('done')
p.close() # 关闭pool,不接受新任务
p.join() # 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0------19024
end
1------20216
end
2------4160
end
3------8796
end
4------19024
end
5------20216
end
6------4160
end
7------8796
end
8------19024
end
9------20216
end
done