標籤:進程鎖 進程間加鎖 進程間互斥
先說說線程
在多線程中,為了保證共用資源的正確性,我們常常會用到線程同步技術.
將一些敏感操作變成原子操作,保證同一時刻多個線程中只有一個線程在執行這個原子操作。
我最常用的是互斥鎖,也稱獨佔鎖。其次還有讀寫鎖,訊號量,條件變數等。
除此之外,我們在處理序間通訊時會用到訊號,向某一個進程發送訊號,該進程中設定訊號處理函數,然後當該進程收到訊號時,執行某些操作。
其實線上程中,也可以接受訊號,利用這種機制,我們也可以用來實現線程同步。更多資訊見 blog.csdn.net/aspnet_lyc/article/details/19904825
再說說進程
進程裡我們通過一些處理序間通訊方式,可以實現進程間的同步。
最近我遇到的一個情況是,某採集系統進程池中很多進程會向同一個記錄檔中列印日誌,如果通過處理序間通訊實現,比較麻煩。
還有一種辦法,如果採用共用記憶體的方式,不同的進程分別將日誌訊息通過共用記憶體放入一個安全執行緒的隊列中,再建立一個進程負責專門列印日誌,這樣也可以保證不被大亂,
保證日誌的正確性,但代碼量也很多阿。
還有一種辦法,在共用記憶體中設定一個互斥鎖,所有進程共用。
如果能像線程一樣,有一個簡單的互斥鎖,用的時候只要加鎖,就能實現進程間的互斥就好了。之前對檔案加鎖,也有些印象,於是我用它實現了一個進程間的互斥鎖
#coding=utf-8"""Process mutex lock.Actually it is implemented by file lock."""import fcntlclass 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()
非常簡單使用,有興趣的朋友可以試一試。
Python 實現進程鎖