在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

問(wèn)題一:

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

問(wèn)題二:

一般的多進(jìn)程隊(duì)列和管道的用法:

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

而分布式進(jìn)程的意思是說(shuō)(我自己說(shuō)的):
兩個(gè)py文件

test1.py
test2.py

分別運(yùn)行其(不是同時(shí)運(yùn)行):

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

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

回答
編輯回答
遲月

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

test1和test2隊(duì)列通信方式:
老老實(shí)實(shí)用socket吧,反正多文件的進(jìn)程間你也沒(méi)辦法加入原子鎖

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

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

from multiprocessing.managers import BaseManager

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


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

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

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

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

2017年1月28日 18:55