亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python通過Manager方式實現多個無關聯進程共享數據的實現

 更新時間:2019年11月07日 09:30:55   作者:我愛學python  
這篇文章主要介紹了Python通過Manager方式實現多個無關聯進程共享數據的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Python實現多進程間通信的方式有很多種,例如隊列,管道等。

但是這些方式只適用于多個進程都是源于同一個父進程的情況。

如果多個進程不是源于同一個父進程,只能用共享內存,信號量等方式,但是這些方式對于復雜的數據結構,例如Queue,dict,list等,使用起來比較麻煩,不夠靈活。

Manager是一種較為高級的多進程通信方式,它能支持Python支持的的任何數據結構。

它的原理是:先啟動一個ManagerServer進程,這個進程是阻塞的,它監(jiān)聽一個socket,然后其他進程(ManagerClient)通過socket來連接到ManagerServer,實現通信。

manager.py代碼,實現server和client兩個類

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
'''
進程間通信
'''
from multiprocessing.managers import BaseManager
from multiprocessing import RLock

MANAGER_PORT = 6000
MANAGER_DOMAIN = '0.0.0.0'
MANAGER_AUTH_KEY = 'aaaaaaaaaaaaaaa'

#定義一個Manager類
class InfoManager(BaseManager): pass


class DictItem():
  def __init__(self, ):
    self.items = dict()

  def set(self, key, value):
    self.items[key] = value

  def get(self, key):
    return self.items.get(key)

  def __setitem__(self, key, value):
    self.set(key, value)

#為這個manager類注冊存儲容器,也就是通過這個manager類實現的共享的變量,
#這個變量最好是一個類實例,自己定義的或者python自動的類的實例都可以
#這里不能把d改成dict(),因為Client那邊執(zhí)行d['keyi']='value'的時候會報錯:d這個變量不能修改
d = DictItem()
lock = RLock()
InfoManager.register('dict', callable=lambda: d)
InfoManager.register('open_qq_login_lock', callable=lambda: lock)


class ManagerServer():
  '''
  multiprocess Manager服務類
  '''

  def __init__(self, domain, port, auth_key):
    self.domain = domain
    self.port = port
    self.auth_key = auth_key

  def start_manager_server(self):
    self.queue_manager = InfoManager(address=('', self.port), authkey=self.auth_key)
    # self.dict = self.queue_manager.dict()
    self.server = self.queue_manager.get_server()

  def run(self):
    self.start_manager_server()
    self.server.serve_forever()

  def stop(self):
    self.server.shutdown()
    self.is_stop = 1


class ManagerClient():
  '''
  訪問mutiprocess Manager的類
  '''

  def __init__(self, domain, port, auth_key):
    self.domain = domain
    self.port = port
    self.auth_key = auth_key
    # self.get_share_dict()
    self.info_manager = InfoManager(address=(self.domain, self.port), authkey=self.auth_key)
    self.info_manager.connect()

  def get_dict(self):
    # self.dict = m.dict()
    self.dict = self.info_manager.dict()
    return self.dict

  def get_open_qq_login_lock(self):
    self.open_qq_login_lock = self.info_manager.open_qq_login_lock()
    return self.open_qq_login_lock


if __name__ == '__main__':
  pass

用法

1.啟動一個ManagerServer,這個進程是阻塞的

import manager

def run():
  manager_server = manager.ManagerServer(manager.MANAGER_DOMAIN, manager.MANAGER_PORT, manager.MANAGER_AUTH_KEY)
  manager_server.run()
if __name__ == '__main__':
  run()

2.實例化一個client,獲取共享的變量

# 進程間共享變量
manager_client = manager.ManagerClient(manager.MANAGER_DOMAIN, manager.MANAGER_PORT, manager.MANAGER_AUTH_KEY)
share_dict = manager_client.get_dict()
open_qq_login_lock = manager_client.get_open_qq_login_lock()

注意:

對client獲取的變量修改,不會影響server那邊的變量,例如server中,client1獲取變量params1,把它修改為params2,server那邊的數據不會修改。如果要修改server的數據,需要調用server的方法,把server那邊的數據刷新。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python3 http.client/server post傳輸json問題

    python3 http.client/server post傳輸json問題

    這篇文章主要介紹了python3 http.client/server post傳輸json問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • pandas DataFrame的修改方法(值、列、索引)

    pandas DataFrame的修改方法(值、列、索引)

    這篇文章主要介紹了pandas DataFrame的修改方法(值、列、索引),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python format()格式化輸出方法

    Python format()格式化輸出方法

    這篇文章主要介紹了Python format()格式化輸出方法, Python 2.6以后,Python 中的就提供了字符串類型(str)提供了 format() 方法對字符串進行格式化,夏敏我們就來了解這個方法吧,需要的小伙伴也可以參考一下

    2021-12-12
  • python單元測試之pytest的使用

    python單元測試之pytest的使用

    Pytest是Python的一種單元測試框架,與 Python 自帶的 Unittest 測試框架類似,但是比 Unittest 框架使用起來更簡潔,效率更高,今天給大家詳細介紹一下pytest的使用,需要的朋友可以參考下
    2021-06-06
  • python遞歸下載文件夾下所有文件

    python遞歸下載文件夾下所有文件

    這篇文章主要為大家詳細介紹了python遞歸下載文件夾下所有文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 深入探索Django中間件的應用場景

    深入探索Django中間件的應用場景

    Django中間件是一種可插拔的應用程序組件,可在請求和響應處理過程中修改Django的行為。中間件可用于處理請求、響應、異常等,還可用于實現身份驗證、緩存、性能監(jiān)控等常用功能。通過深入探索中間件的應用場景,可以提高Django應用程序的可擴展性和靈活性
    2023-05-05
  • python  創(chuàng)建一個保留重復值的列表的補碼

    python 創(chuàng)建一個保留重復值的列表的補碼

    這篇文章主要介紹了python 創(chuàng)建一個保留重復值的列表的補碼的相關資料,需要的朋友可以參考下
    2018-10-10
  • Python 短視頻爬蟲教程

    Python 短視頻爬蟲教程

    今天給大家?guī)硪黄老x小教程,很簡單的幾十行代碼就可以實現了,爬取的目標是短視頻,感興趣的同學快來跟著小編往下看吧
    2021-11-11
  • python PyAutoGUI 模擬鼠標鍵盤操作和截屏功能

    python PyAutoGUI 模擬鼠標鍵盤操作和截屏功能

    一款跨平臺/無依賴的自動化測試工具,目測只能控制鼠標/鍵盤/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標鍵盤操作和截屏功能,需要的朋友可以參考下
    2019-08-08
  • 淺析Python3中的對象垃圾收集機制

    淺析Python3中的對象垃圾收集機制

    在Python中,它在每個對象中保持了一個計數器,用于記錄指向該對象的的引用的個數。這篇文章主要介紹了Python3中的對象垃圾收集機制,需要的朋友可以參考下
    2019-06-06

最新評論