<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        python中進程間數據通訊模塊multiprocessing.Manager的介紹

        來源:懂視網 責編:小采 時間:2020-11-27 14:20:23
        文檔

        python中進程間數據通訊模塊multiprocessing.Manager的介紹

        python中進程間數據通訊模塊multiprocessing.Manager的介紹:本篇文章給大家帶來的內容是關于python中進程間數據通訊模塊multiprocessing.Manager的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。目前開發中有遇到進程間需要共享數據的情況. 所以研究了下multiprocessing.Mana
        推薦度:
        導讀python中進程間數據通訊模塊multiprocessing.Manager的介紹:本篇文章給大家帶來的內容是關于python中進程間數據通訊模塊multiprocessing.Manager的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。目前開發中有遇到進程間需要共享數據的情況. 所以研究了下multiprocessing.Mana

        本篇文章給大家帶來的內容是關于python中進程間數據通訊模塊multiprocessing.Manager的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

        目前開發中有遇到進程間需要共享數據的情況. 所以研究了下multiprocessing.Manager, 主要會以dict為例子, 說明下進程間共享(同一個父進程).

        dict使用說明

        import multiprocessing
        # 1. 創建一個Manger對象
        manager = multiprocessing.Manager()
        # 2. 創建一個dict
        temp_dict = manager.dict()
        # 3. 創建一個測試程序
        def test(idx, test_dict):
         test_dict[idx] = idx
        # 4. 創建進程池進行測試
        pool = multiprocessing.Pool(4)
        for i in range(100):
         pool.apply_async(test, args=(i, temp_dict))
        pool.close()
        pool.join()
        print(temp_dict)

        too simple.

        簡單的源碼分析

        這時我們再看一個例子

        import multiprocessing
        # 1. 創建一個Manger對象
        manager = multiprocessing.Manager()
        # 2. 創建一個dict
        temp_dict = manager.dict()
        temp_dict['test'] = {}
        # 3. 創建一個測試程序
        def test(idx, test_dict):
         test_dict['test'][idx] = idx
        # 4. 創建進程池進行測試
        pool = multiprocessing.Pool(4)
        for i in range(100):
         pool.apply_async(test, args=(i, temp_dict))
        pool.close()
        pool.join()
        print(temp_dict)

        可以看到輸出結果是奇怪的{'test': {}}
        如果我們簡單修改一下代碼

        import multiprocessing
        # 1. 創建一個Manger對象
        manager = multiprocessing.Manager()
        # 2. 創建一個dict
        temp_dict = manager.dict()
        temp_dict['test'] = {}
        # 3. 創建一個測試程序
        def test(idx, test_dict):
         row = test_dict['test']
         row[idx] = idx
         test_dict['test'] = row
        # 4. 創建進程池進行測試
        pool = multiprocessing.Pool(4)
        for i in range(100):
         pool.apply_async(test, args=(i, temp_dict))
        pool.close()
        pool.join()
        print(temp_dict)

        這時輸出結果就符合預期了.

        為了了解這個現象背后的原因, 我簡單去讀了一下源碼, 主要有以下幾段代碼很關鍵.

        def Manager():
         '''
         Returns a manager associated with a running server process
        
         The managers methods such as `Lock()`, `Condition()` and `Queue()`
         can be used to create shared objects.
         '''
         from multiprocessing.managers import SyncManager
         m = SyncManager()
         m.start()
         return m
         
        ...
         def start(self, initializer=None, initargs=()):
         '''
         Spawn a server process for this manager object
         '''
         assert self._state.value == State.INITIAL
        
         if initializer is not None and not hasattr(initializer, '__call__'):
         raise TypeError('initializer must be a callable')
        
         # pipe over which we will retrieve address of server
         reader, writer = connection.Pipe(duplex=False)
        
         # spawn process which runs a server
         self._process = Process(
         target=type(self)._run_server,
         args=(self._registry, self._address, self._authkey,
         self._serializer, writer, initializer, initargs),
         )
         ident = ':'.join(str(i) for i in self._process._identity)
         self._process.name = type(self).__name__ + '-' + ident
         self._process.start()
        ...

        上面代碼可以看出, 當我們聲明了一個Manager對象的時候, 程序實際在其他進程啟動了一個server服務, 這個server是阻塞的, 以此來實現進程間數據安全.
        我的理解就是不同進程之間操作都是互斥的, 一個進程向server請求到這部分數據, 再把這部分數據修改, 返回給server, 之后server再去處理其他進程的請求.

        回到上面的奇怪現象上, 這個操作test_dict['test'][idx] = idx實際上在拉取到server上的數據后進行了修改, 但并沒有返回給server, 所以temp_dict的數據根本沒有變化. 在第二段正常代碼, 就相當于先向服務器請求數據, 再向服務器傳送修改后的數據. 這樣就可以解釋這個現象了.

        進程間數據安全

        這個時候如果出現一種情況, 兩個進程同時請求了一份相同的數據, 分別進行修改, 再提交到server上會怎么樣呢? 那當然是數據產生異常. 基于此, 我們需要Manager的另一個對象, Lock(). 這個對象也不難理解, Manager本身就是一個server, dict跟lock都來自于這個server, 所以當你lock住的時候, 其他進程是不能取到數據, 自然也不會出現上面那種異常情況.

        代碼示例:

        import multiprocessing
        # 1. 創建一個Manger對象
        manager = multiprocessing.Manager()
        # 2. 創建一個dict
        temp_dict = manager.dict()
        lock = manager.Lock()
        temp_dict['test'] = {}
        # 3. 創建一個測試程序
        def test(idx, test_dict, lock):
         lock.acquire()
         row = test_dict['test']
         row[idx] = idx
         test_dict['test'] = row
         lock.release()
        # 4. 創建進程池進行測試
        pool = multiprocessing.Pool(4)
        for i in range(100):
         pool.apply_async(test, args=(i, temp_dict, lock))
        pool.close()
        pool.join()
        print(temp_dict)

        切忌不要進程里自己新建lock對象, 要使用統一的lock對象.

        本篇文章到這里就已經全部結束了,更多其他精彩內容可以關注PHP中文網的python視頻教程欄目!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        python中進程間數據通訊模塊multiprocessing.Manager的介紹

        python中進程間數據通訊模塊multiprocessing.Manager的介紹:本篇文章給大家帶來的內容是關于python中進程間數據通訊模塊multiprocessing.Manager的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。目前開發中有遇到進程間需要共享數據的情況. 所以研究了下multiprocessing.Mana
        推薦度:
        標簽: 數據 通訊 模塊
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 99ri精品国产亚洲| 国产亚洲精品资源在线26u| 亚洲人成在线免费观看| 亚洲一区二区三区免费观看| 亚洲AV日韩精品久久久久久久 | 精品久久香蕉国产线看观看亚洲| 日韩a毛片免费观看| 哒哒哒免费视频观看在线www | 又粗又长又爽又长黄免费视频| 全亚洲最新黄色特级网站| 午夜免费国产体验区免费的| 亚洲国产电影av在线网址| 尤物视频在线免费观看| 久久亚洲国产午夜精品理论片| 午夜无码A级毛片免费视频| 亚洲精品综合久久中文字幕 | 亚洲国产电影在线观看| 欧洲黑大粗无码免费| 亚洲AV成人无码网天堂| 亚洲а∨天堂久久精品| 国产中文字幕在线免费观看| 亚洲色偷偷av男人的天堂| 最近的免费中文字幕视频 | 国产成人亚洲综合| 老司机69精品成免费视频| 91亚洲性爱在线视频| 日韩成人在线免费视频| 久久国产免费直播| 亚洲精品日韩中文字幕久久久| 最近中文字幕免费mv视频8| 九九视频高清视频免费观看| 亚洲gv猛男gv无码男同短文| 国产在线观看片a免费观看| 久久亚洲精品11p| 亚洲国产精品无码成人片久久| 免费下载成人电影| 一级毛片免费观看不收费| 亚洲人成电影亚洲人成9999网| 午夜免费福利在线| 久久国产乱子伦精品免费不卡 | 久久国产精品2020免费m3u8|