欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python通過Manager方式實(shí)現(xiàn)多個無關(guān)聯(lián)進(jìn)程共享數(shù)據(jù)的實(shí)現(xiàn)

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

Python實(shí)現(xiàn)多進(jìn)程間通信的方式有很多種,例如隊(duì)列,管道等。

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

如果多個進(jìn)程不是源于同一個父進(jìn)程,只能用共享內(nèi)存,信號量等方式,但是這些方式對于復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如Queue,dict,list等,使用起來比較麻煩,不夠靈活。

Manager是一種較為高級的多進(jìn)程通信方式,它能支持Python支持的的任何數(shù)據(jù)結(jié)構(gòu)。

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

manager.py代碼,實(shí)現(xiàn)server和client兩個類

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
'''
進(jìn)程間通信
'''
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類實(shí)現(xiàn)的共享的變量,
#這個變量最好是一個類實(shí)例,自己定義的或者python自動的類的實(shí)例都可以
#這里不能把d改成dict(),因?yàn)镃lient那邊執(zhí)行d['keyi']='value'的時(shí)候會報(bào)錯:d這個變量不能修改
d = DictItem()
lock = RLock()
InfoManager.register('dict', callable=lambda: d)
InfoManager.register('open_qq_login_lock', callable=lambda: lock)


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

  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,這個進(jìn)程是阻塞的

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.實(shí)例化一個client,獲取共享的變量

# 進(jìn)程間共享變量
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那邊的數(shù)據(jù)不會修改。如果要修改server的數(shù)據(jù),需要調(diào)用server的方法,把server那邊的數(shù)據(jù)刷新。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    Python format()格式化輸出方法

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

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

    python單元測試之pytest的使用

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

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

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

    深入探索Django中間件的應(yīng)用場景

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

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

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

    Python 短視頻爬蟲教程

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

    python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能

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

    淺析Python3中的對象垃圾收集機(jī)制

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

最新評論