本文實例講述了Python多進程入門、分布式進程數據共享。分享給大家供大家參考,具體如下:
python多進程入門
https://docs.python.org/3/library/multiprocessing.html
1、先來個簡單的
# coding: utf-8 from multiprocessing import Process # 定義函數 def addUser(): print("addUser") if __name__ == "__main__": p1 = Process(target=addUser) p1.start()
多進程包
multiprocessing
;
創建進程
p1 = Process(target=函數名)
;
開始進程
p1.start()
。
2、通過進程ID來區分父子進程
# coding: utf-8 from multiprocessing import Process import os # 定義一個list myList = ["a","b"]; # 定義函數 def addUser(list): print(os.getpid()) # 進程ID print(os.getppid()) # 父進程ID if __name__ == "__main__": p1 = Process(target=addUser,args=(myList,)) p1.start() # 這里是主進程 print("父進程ID:"+str(os.getpid())) # 進程ID
父進程ID:27084
27085
27084
3、主進程等等子進程執行完畢
# 定義一個list myList = ["a","b"]; # 定義函數 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)
先于子進程的
print(list)
執行。
在主進程里,只需要加一句代碼:
p1.join() # 等待子進程執行完畢 print(myList)
['a', 'b', 'c']
['a', 'b']
執行的順序就不一樣了。
分布式進程數據共享
通過
Manager
實現數據共享。
Manager會創建一個服務進程,其他的進程都統一來訪問這個server進程,從而達到多進程之間的數據通信。
一旦主進程結束,則server進程也講結束
1、不多說,直接上代碼
# coding: utf-8 from multiprocessing import Process, Manager # 定義函數 def addUser(list): list.append("c") # 給list添加了一個元素 print(list) if __name__ == "__main__": mgr = Manager() my_list = mgr.list(["a","b"]) # 通過Manager對象創建list p1 = Process(target=addUser,args=(my_list,)) p1.start() p1.join() print(my_list)
注意2次打印list,在子進程(addUser())里還改變了list數據。我們看看2次打印結果:
['a', 'b', 'c']
['a', 'b', 'c']
說明通過Manager對象創建的list數據能夠在進程之間通信了。
2、分布式的數據共享
https://docs.python.org/3/library/multiprocessing.html
2.1、創建一個server
datamgr.py內容如下:
# 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永不關閉 server = mgr.get_server() server.serve_forever()
作為數據提供者。
2.2、在test.py里(可能是另外一臺服務器里) 連接這個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() # 連接遠程的server my_list = mgr.getUser() # 從server獲取數據 print(my_list) # ['a', 'b']
連上了,并獲取到了數據。
3、創建2個子進程,修改list數據,看看是不是能夠共享?
# 定義函數 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() # 連接遠程的server my_list = mgr.getUser() # 從server獲取數據 # 創建2個子進程 p1 = Process(target=addUser,args=(my_list,)) p1.start() p2 = Process(target=addUser2, args=(my_list,)) p2.start() # 等待2個子進程執行完畢 p1.join() p2.join() # 在主進程打印最終的list print(my_list) # ['a', 'b', 'c', 'd']
顯然,在子進程里往list添加數據有效。
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》、《Python+MySQL數據庫程序設計入門教程》及《Python常見數據庫操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
