40.多进程同步--锁--多把锁
生活随笔
收集整理的這篇文章主要介紹了
40.多进程同步--锁--多把锁
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多進程同步?
- 首先多進程默認是并發(fā)行為,多個進程同時執(zhí)行
- 執(zhí)行的順序,以及何時執(zhí)行完畢無法控制
- 多個進程如果涉及到了通信,數據的有序性無法保證
- 需要鎖來控制進程之間執(zhí)行的順序
- 對于進程資源的控制
- 缺點:同步進程,并發(fā)沒有了。效率低下。
- Lock:一把鎖
- Lock.acquire() 拿著鎖 通信證
- 搶占鎖,如果拿不到,阻塞等待
- Lock.release() 放掉鎖
- 一定要記得在工作完畢之后釋放鎖。
- **Semaphore**:多把鎖,同時提供多把鎖/通行證,保證可以有一定個數的進程保持并發(fā),這個用的多一點
- 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()
?
轉載于:https://www.cnblogs.com/zhangan/p/10262456.html
總結
以上是生活随笔為你收集整理的40.多进程同步--锁--多把锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀铃声是什么歌呢?
- 下一篇: 【代码笔记】Web-CSS-CSS id