多进程同步
- 首先多进程默认是并发行为,多个进程同时执行
- 执行的顺序,以及何时执行完毕无法控制
- 多个进程如果涉及到了通信,数据的有序性无法保证
- 需要锁来控制进程之间执行的顺序
- 对于进程资源的控制
- 缺点:同步进程,并发没有了。效率低下。
-
Lock:一把锁
-
Lock.acquire() 拿着锁 通信证
- 抢占锁,如果拿不到,阻塞等待
-
Lock.release() 放掉锁
- 一定要记得在工作完毕之后释放锁。
-
**Semaphore**:多把锁,同时提供多把锁/通行证,保证可以有一定个数的进程保持并发,这个用的多一点
-
s = Semaphore(3)
-
s.acquire()
-
s.release()
-
- 一般情况下我们多进程操作数据库的时候必须加锁,这样才能保证数据的有序性
-
#多进程同步/锁 from multiprocessing import Process,current_process,Lock import sys from time import sleep def work(l): print('%s进程已经开始了' % current_process().name) l.acquire() #抢占这个通信证/锁 for var in range(65,68): print('%s:%s' % (current_process().name,chr(var))) sys.stdout.flush() l.release() #放掉通行证 def main(): l = Lock() Process(target=work,name='a',args=(l,)).start() Process(target=work,name='b',args=(l,)).start() Process(target=work,name='c',args=(l,)).start() if __name__ == "__main__": main()
运行结果:
a进程已经开始了 y a:A a:B a:C b进程已经开始了 b:A b:B b:C c进程已经开始了 c:A c:B c:C
-
#多进程同步/多把锁(信号量) from multiprocessing import Process,current_process,Semaphore import sys from time import sleep def work(s): print('%s进程已经开始了' % current_process().name) s.acquire() for var in range(65,100): print('%s:%s' % (current_process().name,chr(var))) sys.stdout.flush() s.release() def main(): s = Semaphore(3) #通行证,限制同一时间提供了3把锁,也就是说同一时间最多3个进程同时工作,其余的进程阻塞等待, Process(target=work,name='a',args=(s,)).start() Process(target=work,name='b',args=(s,)).start() Process(target=work,name='c',args=(s,)).start() Process(target=work,name='d',args=(s,)).start() Process(target=work,name='e',args=(s,)).start() if __name__ == "__main__": main()