1、先來個簡單的
# coding: utf-8
from multiprocessing import process
# 定義函式
defadduser
(): 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"];
# 定義函式
defadduser
(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"];
# 定義函式
defadduser
(list):
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
# 定義函式
defadduser
(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、分布式的資料共享
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資料,看看是不是能夠共享?
# 定義函式
defadduser
(list):
defadduser2
(list):
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 分布式程序
process可以分布到多台機器上,而thread最多只能分布到同一臺機器的多個cpu上。python的multiprocessing模組不但支援多程序,其中managers子模組還支援把多程序分布到多台機器上。乙個服務程序可以作為排程者,將任務分布到其他多個程序中,依靠網路通訊。由於manager...
Python 分布式程序
分布式程序是將process程序分布到多台伺服器中,利用多台機器的效能完成複雜的任務。可以應用到分布式爬蟲的開發中。分布式程序在python中依然要用到multiprocess模組。它不但支援多程序,其中managers子模組還支援吧多程序分不到多台機器上,可以寫乙個服務程序作為排程者,將任務分不到...