multiprocessing.Pool的进程锁

通常情况下,python标准库中的multiprocessing.Lock对象是不可以作为进程池Pool的参数,这是因为进程锁不能通过pickle序列化。以下提供两种方法允许在多进程使用过程中引入进程锁,解决资源竞争问题。

参数绑定

实例化Manager()和创建Manager.Lock(),但是使用Manager会产生大量的进程,同时所有获取锁和释放锁的请求都会发送给Manager,这样会造成进程资源的消耗。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import multiprocessing
from functools import partial
def main():
iterable = [1, 2, 3, 4, 5]
pool = multiprocessing.Pool()
m = multiprocessing.Manager()
l = m.Lock()
# functool.partial作用是把keywords,args的参数传入到func中后,生成一个新的函数,其实仍然是func函数,只是有部分参数已经代入
# 这里是为了解决pool.map函数只接受一个iterator作为参数,所以需要将iterator和进程锁绑定在一起
func = partial(target, l)
pool.map(func, iterable)
pool.close()
pool.join()

将进程锁置为全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import multiprocessing
def target(iterable_item):
for item in items:
if some conditions:
with lock:
# write to stdout or logfile, etc
pass
def init(l):
global lock
lock = l
def main():
iterable = [1, 2, 3, 4, 5]
l = multiprocessing.Lock()
poll = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(target, iterable)
pool.close()
pool.join()
文章目录
  1. 1. 参数绑定
  2. 2. 将进程锁置为全局变量
|