Python多進程入門、分布式進程數(shù)據(jù)共享實例詳解
本文實例講述了Python多進程入門、分布式進程數(shù)據(jù)共享。分享給大家供大家參考,具體如下:
python多進程入門
https://docs.python.org/3/library/multiprocessing.html
1、先來個簡單的
# coding: utf-8
from multiprocessing import Process
# 定義函數(shù)
def addUser():
print("addUser")
if __name__ == "__main__":
p1 = Process(target=addUser)
p1.start()
多進程包multiprocessing;
創(chuàng)建進程p1 = Process(target=函數(shù)名);
開始進程p1.start()。
2、通過進程ID來區(qū)分父子進程
# coding: utf-8
from multiprocessing import Process
import os
# 定義一個list
myList = ["a","b"];
# 定義函數(shù)
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、主進程等等子進程執(zhí)行完畢
# 定義一個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)先于子進程的print(list)執(zhí)行。
在主進程里,只需要加一句代碼:
p1.join() # 等待子進程執(zhí)行完畢 print(myList)
['a', 'b', 'c']
['a', 'b']
執(zhí)行的順序就不一樣了。
分布式進程數(shù)據(jù)共享
通過Manager實現(xiàn)數(shù)據(jù)共享。
Manager會創(chuàng)建一個服務進程,其他的進程都統(tǒng)一來訪問這個server進程,從而達到多進程之間的數(shù)據(jù)通信。
一旦主進程結束,則server進程也講結束
1、不多說,直接上代碼
# coding: utf-8
from multiprocessing import Process, Manager
# 定義函數(shù)
def addUser(list):
list.append("c") # 給list添加了一個元素
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,在子進程(addUser())里還改變了list數(shù)據(jù)。我們看看2次打印結果:
['a', 'b', 'c']
['a', 'b', 'c']
說明通過Manager對象創(chuàng)建的list數(shù)據(jù)能夠在進程之間通信了。
2、分布式的數(shù)據(jù)共享
https://docs.python.org/3/library/multiprocessing.html
2.1、創(chuàng)建一個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()
作為數(shù)據(jù)提供者。
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獲取數(shù)據(jù)
print(my_list) # ['a', 'b']
連上了,并獲取到了數(shù)據(jù)。
3、創(chuàng)建2個子進程,修改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() # 連接遠程的server
my_list = mgr.getUser() # 從server獲取數(shù)據(jù)
# 創(chuàng)建2個子進程
p1 = Process(target=addUser,args=(my_list,))
p1.start()
p2 = Process(target=addUser2, args=(my_list,))
p2.start()
# 等待2個子進程執(zhí)行完畢
p1.join()
p2.join()
# 在主進程打印最終的list
print(my_list) # ['a', 'b', 'c', 'd']
顯然,在子進程里往list添加數(shù)據(jù)有效。
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python 常用日期處理 -- calendar 與 dateutil 模塊的使用
這篇文章主要介紹了Python如何使用calendar 與 dateutil 模塊處理日期,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-09-09
Numpy創(chuàng)建數(shù)組和隨機數(shù)組的方法小結
這篇文章主要為大家詳細介紹了Numpy創(chuàng)建數(shù)組和隨機數(shù)組的方法小結,文中的示例代碼講解詳細,對我們學習Python有一定幫助,具有一定的參考價值,需要的可以參考一下2023-11-11
把項目從Python2.x移植到Python3.x的經(jīng)驗總結
這篇文章主要介紹了把項目從Python2.x移植到Python3.x的經(jīng)驗總結,包括作者所使用的Jinja2框架中一些需要注意的地方,需要的朋友可以參考下2015-04-04

