>我有一个python程序如下
import multiprocessing
import time
icout=1
def send_request(data):
lock.acquire()
time.sleep(0.5)
global icout
icout=icout+1
print(icout)
lock.release()
def init(l):
global lock
lock = l
if __name__ == '__main__':
data_list = ['data1', 'data2', 'data3']
lock = multiprocessing.Lock()
pool = multiprocessing.Pool(3, initializer=init, initargs=(lock,))
pool.map(send_request, data_list)
pool.close()
pool.join()
当我注释掉语句time.sleep(0.5)
时,它将打印 1,2,3。 当我保留语句time.sleep(0.5)
时,它将打印2,2,2
我的问题是当我保持这个语句time.sleep(0.5)
时,为什么程序的输出不是 1、2、3 我已经锁定了它,似乎锁定不起作用。
因此,尽管有 2,3,4 但这里有一种基于共享内存管理器的方法:
import multiprocessing
import time
def send_request(data):
lock.acquire()
try:
time.sleep(0.5)
data['c'] = data['c'] + 1
print(data['c'])
finally:
lock.release()
def init(l):
global lock
lock = l
if __name__ == '__main__':
data_list = ['data1', 'data2', 'data3']
with multiprocessing.Manager() as manager:
d = manager.dict()
d['c'] = 1
lock = manager.Lock()
pool = multiprocessing.Pool(3, initializer=init, initargs=(lock,))
pool.map(send_request, [d,d,d])
pool.close()
pool.join()
这个想法是全局变量不会起作用,因为我们正在生成进程:因此我们需要一些共享内存。这就是经理给我们的。也看到这个答案。