鍍金池/ 問答/Python  C  C++  Ruby  網(wǎng)絡安全/ Python 分布式進程如何交換數(shù)據(jù)?

Python 分布式進程如何交換數(shù)據(jù)?

我知道多進程,也知道多進程交換數(shù)據(jù)用隊列Queue和管道Pipes

問題一:

隊列和管道是在內(nèi)存中交換數(shù)據(jù)?還是在文件中交換數(shù)據(jù)?win和linux上實現(xiàn)會有不同嗎?

問題二:

一般的多進程隊列和管道的用法:

# 在一個python文件中指定,然后把隊列作為參數(shù)傳入進程函數(shù):
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))

而分布式進程的意思是說(我自己說的):
兩個py文件

test1.py
test2.py

分別運行其(不是同時運行):

# 15:37
python test1.py
# 15.38
python test2.py

這樣也是兩個進程,只是運行在不同的python窗口,他們怎么交換數(shù)據(jù)?這用管道和隊列就不能實現(xiàn)了吧
我也不知道我為啥會問這樣的問題...
原來我的做法是,直接用tcp把它們連起來,完全夠用,還可以通過網(wǎng)絡分布出去
但是我就想直接在本地,沒必要用網(wǎng)絡吧,能不能直接讓它兩在內(nèi)存中就交換數(shù)據(jù)?
這樣豈不美哉233
謝謝

回答
編輯回答
遲月

test1和test2共享內(nèi)存通信方式:
test1向redis的key1中寫入數(shù)據(jù),test2讀取redis的key1數(shù)據(jù),用于流式傳輸,與隊列不同,無法判斷重讀或未讀

test1和test2隊列通信方式:
老老實實用socket吧,反正多文件的進程間你也沒辦法加入原子鎖

2018年5月6日 16:43
編輯回答
青瓷

我覺得有兩種解決方案:
1.把Queue注冊到網(wǎng)絡

from multiprocessing.managers import BaseManager

# 發(fā)送任務的隊列:
task_queue = queue.Queue()


# 從BaseManager繼承的QueueManager:
class QueueManager(BaseManager):
    pass

# 把Queue都注冊到網(wǎng)絡上, callable參數(shù)關聯(lián)了Queue對象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)

# 綁定端口5000, 設置驗證碼'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')

2.通過數(shù)據(jù)庫如redis交互。

2017年1月28日 18:55