Python簡單進程鎖代碼實例
先說說線程
在多線程中,為了保證共享資源的正確性,我們常常會用到線程同步技術(shù).
將一些敏感操作變成原子操作,保證同一時刻多個線程中只有一個線程在執(zhí)行這個原子操作。
我最常用的是互斥鎖,也稱獨占鎖。其次還有讀寫鎖,信號量,條件變量等。
除此之外,我們在進程間通信時會用到信號,向某一個進程發(fā)送信號,該進程中設(shè)置信號處理函數(shù),然后當(dāng)該進程收到信號時,執(zhí)行某些操作。
其實在線程中,也可以接受信號,利用這種機制,我們也可以用來實現(xiàn)線程同步。更多信息見 http://www.dbjr.com.cn/article/64977.htm
再說說進程
進程里我們通過一些進程間通信方式,可以實現(xiàn)進程間的同步。
最近我遇到的一個情況是,某采集系統(tǒng)進程池中很多進程會向同一個日志文件中打印日志,如果通過進程間通信實現(xiàn),比較麻煩。
還有一種辦法,如果采用共享內(nèi)存的方式,不同的進程分別將日志消息通過共享內(nèi)存放入一個線程安全的隊列中,再建立一個進程負責(zé)專門打印日志,這樣也可以保證不被大亂,
保證日志的正確性,但代碼量也很多阿。
還有一種辦法,在共享內(nèi)存中設(shè)置一個互斥鎖,所有進程共享。
如果能像線程一樣,有一個簡單的互斥鎖,用的時候只要加鎖,就能實現(xiàn)進程間的互斥就好了。之前對文件加鎖,也有些印象,于是我用它實現(xiàn)了一個進程間的互斥鎖
#coding=utf-8 """ Process mutex lock. Actually it is implemented by file lock. """ import fcntl class ProcessLock(object): __lockfd = None @staticmethod def lock(): ProcessLock.__lockfd = open(__file__, 'a+') fcntl.flock(ProcessLock.__lockfd, fcntl.LOCK_EX) @staticmethod def unlock(): fcntl.flock(ProcessLock.__lockfd, fcntl.LOCK_UN)
加鎖 ProcessLock.lock()
釋放 ProcessLock.unlock()
非常簡單使用,有興趣的朋友可以試一試。
相關(guān)文章
淺談Tensorflow 動態(tài)雙向RNN的輸出問題
今天小編就為大家分享一篇淺談Tensorflow 動態(tài)雙向RNN的輸出問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-012023巨詳細的Python安裝庫教程(以pycharm和Anaconda安裝pygame為例)
這篇文章主要給大家介紹了巨詳細的Python安裝庫教程,文中以pycharm和Anaconda安裝pygame為例,通過圖文介紹的非常詳細,需要的朋友可以參考下2024-01-01配置jupyter notebook全步驟,更改默認(rèn)路徑,jupyter不是問題
這篇文章主要介紹了配置jupyter notebook全步驟,更改默認(rèn)路徑,jupyter不是問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Python學(xué)習(xí)之字符串函數(shù)使用詳解
Python的友好在于提供了非常好強大的功能函數(shù)模塊,對于字符串的使用,同樣提供許多簡單便捷的字符串函數(shù)。Python 字符串自帶了很多有用的函數(shù),快來跟隨小編學(xué)習(xí)一下這些函數(shù)的應(yīng)用詳解吧2021-12-12Pycharm安裝第三方庫時Non-zero exit code錯誤解決辦法
這篇文章主要介紹了Pycharm安裝第三方庫時Non-zero exit code錯誤解決辦法,最好的解決辦法可以通過“Pycharm”左下角的“Terminal”,在pycharm內(nèi)使用pip安裝,以安裝“requests”為例,需要的朋友可以參考下2023-01-01GitHub?AI編程工具copilot在Pycharm的應(yīng)用
最近聽說github出了一種最新的插件叫做copilot,這篇文章主要給大家介紹了關(guān)于GitHub?AI編程工具copilot在Pycharm的應(yīng)用,目前感覺確實不錯,建議大家也去使用,需要的朋友可以參考下2022-04-04