python多程序入門 分布式程序資料共享

2021-08-11 04:07:47 字數 3762 閱讀 2168

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子模組還支援吧多程序分不到多台機器上,可以寫乙個服務程序作為排程者,將任務分不到...