进程锁
多个进程之间虽然是独立的,但仅限于内存和运算,如果涉及到其它一些资源,就可能存在竞争问题,当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题,添加进程锁则可以解决此类问题。
进程锁,在同一时间执行一个进程
要注意,锁不能滥用,若是因为某些原因没有解锁,就会造成死锁的现象,这样后面的进程也就无法执行。
进程锁的创建:模块multiprocessing的Manager类
from multiprocessing import Manager
manager = Manager()
lock = manage.Lock
进程锁的加锁和解锁
例1:不加锁
import os
import time
from multiprocessing import Pool
def test(count):
print(f'count={count},进程号:{os.getpid()}')
time.sleep(1)
if __name__ == '__main__':
start_time = time.time()
# 创建一个进程池,里面有3个进程
p = Pool(3)
for i in range(9):
p.apply_async(func=test, args=(i,))
p.close()
p.join()
print(f'间隔时间:{time.time() - start_time}')
结果:
例2:加锁
import os
import time
from multiprocessing import Pool
from multiprocessing import Manager
def test(count, lock):
# 加锁
lock.acquire()
print(f'count={count},进程号:{os.getpid()}')
time.sleep(1)
# 解锁
lock.release()
return '返回值:count=%s,进程号=%s' % (count, os.getpid())
if __name__ == '__main__':
# 创建锁
manage = Manager()
lock = manage.Lock()
start_time = time.time()
# 创建一个进程池,里面有3个进程
p = Pool(3)
for i in range(9):
p.apply_async(func=test, args=(i, lock))
p.close()
p.join()
print(f'间隔时间:{time.time() - start_time}')
结果:
- 之前未加锁时,是3个线程在相同时间并行执行,9个任务大概花了3s
- 加上锁后,时间间隔是9s,同一时间只有一个进程在执行,9个任务大概花了9s