Python多進(jìn)程入門、分布式進(jìn)程數(shù)據(jù)共享實(shí)例詳解
本文實(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ì)有所幫助。
相關(guān)文章
一篇文章帶你了解python標(biāo)準(zhǔn)庫--os模塊
在本篇內(nèi)容里小編給大家整理的是關(guān)于Python中os模塊及用法相關(guān)知識點(diǎn),有興趣的朋友們可以學(xué)習(xí)下,希望能給你帶來幫助2021-08-08Python使用CRC32實(shí)現(xiàn)校驗(yàn)文件
CRC文件校驗(yàn)是一種用于驗(yàn)證文件完整性的方法,通過計(jì)算文件的CRC值并與預(yù)先計(jì)算的CRC校驗(yàn)值進(jìn)行比較,來判斷文件是否發(fā)生變化,本文我們就來介紹一下Python如何利用CRC32實(shí)現(xiàn)校驗(yàn)文件吧2023-10-10Python 常用日期處理 -- calendar 與 dateutil 模塊的使用
這篇文章主要介紹了Python如何使用calendar 與 dateutil 模塊處理日期,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,具有一定的參考價(jià)值,需要的可以參考一下2023-11-11把項(xiàng)目從Python2.x移植到Python3.x的經(jīng)驗(yàn)總結(jié)
這篇文章主要介紹了把項(xiàng)目從Python2.x移植到Python3.x的經(jīng)驗(yàn)總結(jié),包括作者所使用的Jinja2框架中一些需要注意的地方,需要的朋友可以參考下2015-04-04