日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python多進(jìn)程入門、分布式進(jìn)程數(shù)據(jù)共享實(shí)例詳解

系統(tǒng) 1769 0

本文實(shí)例講述了Python多進(jìn)程入門、分布式進(jìn)程數(shù)據(jù)共享。分享給大家供大家參考,具體如下:

python多進(jìn)程入門

https://docs.python.org/3/library/multiprocessing.html

1、先來個(gè)簡單的

            
# coding: utf-8
from multiprocessing import Process
# 定義函數(shù)
def addUser():
  print("addUser")
if __name__ == "__main__":
  p1 = Process(target=addUser)
  p1.start()


          

多進(jìn)程包 multiprocessing ;
創(chuàng)建進(jìn)程 p1 = Process(target=函數(shù)名) ;
開始進(jìn)程 p1.start()

2、通過進(jìn)程ID來區(qū)分父子進(jìn)程

            
# coding: utf-8
from multiprocessing import Process
import os
# 定義一個(gè)list
myList = ["a","b"];
# 定義函數(shù)
def addUser(list):
  print(os.getpid()) # 進(jìn)程ID
  print(os.getppid()) # 父進(jìn)程ID
if __name__ == "__main__":
  p1 = Process(target=addUser,args=(myList,))
  p1.start()
  # 這里是主進(jìn)程
  print("父進(jìn)程ID:"+str(os.getpid())) # 進(jìn)程ID


          

父進(jìn)程ID:27084
27085
27084

3、主進(jìn)程等等子進(jìn)程執(zhí)行完畢

            
# 定義一個(gè)list
myList = ["a","b"];
# 定義函數(shù)
def addUser(list):
  list.append("c")
  print(list)
if __name__ == "__main__":
  p1 = Process(target=addUser,args=(myList,))
  p1.start()
  print(myList)


          

['a', 'b']
['a', 'b', 'c']

主線程的 print(myList) 先于子進(jìn)程的 print(list) 執(zhí)行。

在主進(jìn)程里,只需要加一句代碼:

            
p1.join() # 等待子進(jìn)程執(zhí)行完畢
print(myList)


          

['a', 'b', 'c']
['a', 'b']

執(zhí)行的順序就不一樣了。

分布式進(jìn)程數(shù)據(jù)共享

通過 Manager 實(shí)現(xiàn)數(shù)據(jù)共享。

Manager會(huì)創(chuàng)建一個(gè)服務(wù)進(jìn)程,其他的進(jìn)程都統(tǒng)一來訪問這個(gè)server進(jìn)程,從而達(dá)到多進(jìn)程之間的數(shù)據(jù)通信。

一旦主進(jìn)程結(jié)束,則server進(jìn)程也講結(jié)束

1、不多說,直接上代碼

            
# coding: utf-8
from multiprocessing import Process, Manager
# 定義函數(shù)
def addUser(list):
  list.append("c") # 給list添加了一個(gè)元素
  print(list)
if __name__ == "__main__":
  mgr = Manager()
  my_list = mgr.list(["a","b"]) # 通過Manager對象創(chuàng)建list
  p1 = Process(target=addUser,args=(my_list,))
  p1.start()
  p1.join()
  print(my_list)


          

注意2次打印list,在子進(jìn)程(addUser())里還改變了list數(shù)據(jù)。我們看看2次打印結(jié)果:

['a', 'b', 'c']
['a', 'b', 'c']

說明通過Manager對象創(chuàng)建的list數(shù)據(jù)能夠在進(jìn)程之間通信了。

2、分布式的數(shù)據(jù)共享
https://docs.python.org/3/library/multiprocessing.html

2.1、創(chuàng)建一個(gè)server

datamgr.py內(nèi)容如下:

            
# coding: utf-8
from multiprocessing.managers import BaseManager
if __name__ == "__main__":
   mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
   mgr.register("getUser", callable=lambda :["a","b"])
   # server永不關(guān)閉
   server = mgr.get_server()
   server.serve_forever()


          

作為數(shù)據(jù)提供者。

2.2、在test.py里(可能是另外一臺服務(wù)器里) 連接這個(gè)server

            
# coding: utf-8
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
if __name__ == "__main__":
  mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
  mgr.register("getUser")
  mgr.connect() # 連接遠(yuǎn)程的server
  my_list = mgr.getUser() # 從server獲取數(shù)據(jù)
  print(my_list) # ['a', 'b']


          

連上了,并獲取到了數(shù)據(jù)。

3、創(chuàng)建2個(gè)子進(jìn)程,修改list數(shù)據(jù),看看是不是能夠共享?

            
# 定義函數(shù)
def addUser(list):
  list.append("c")
def addUser2(list):
  list.append("d")
if __name__ == "__main__":
  mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
  mgr.register("getUser")
  mgr.connect() # 連接遠(yuǎn)程的server
  my_list = mgr.getUser() # 從server獲取數(shù)據(jù)
  # 創(chuàng)建2個(gè)子進(jìn)程
  p1 = Process(target=addUser,args=(my_list,))
  p1.start()
  p2 = Process(target=addUser2, args=(my_list,))
  p2.start()
  # 等待2個(gè)子進(jìn)程執(zhí)行完畢
  p1.join()
  p2.join()
  # 在主進(jìn)程打印最終的list
  print(my_list) # ['a', 'b', 'c', 'd']


          

顯然,在子進(jìn)程里往list添加數(shù)據(jù)有效。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計(jì)入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 嵊州市| 胶南市| 五台县| 临汾市| 尉犁县| 隆化县| 武城县| 九寨沟县| 合水县| 南召县| 开鲁县| 泸定县| 长岛县| 清苑县| 彩票| 永登县| 新乡县| 北票市| 达孜县| 社旗县| 洛隆县| 鞍山市| 安西县| 太和县| 油尖旺区| 抚顺市| 营口市| 伊春市| 通许县| 来宾市| 阿荣旗| 综艺| 四子王旗| 灵武市| 福泉市| 噶尔县| 彭泽县| 阿鲁科尔沁旗| 囊谦县| 微山县| 柳林县|