小驚大怪
你是不是在用Python3或者在windows系統(tǒng)上編程?最重要的是你對進(jìn)程和線程不是很清楚?那么恭喜你,在python分布式進(jìn)程中,會有坑等著你去挖。。。(hahahaha,此處允許我嚇唬一下你)開玩笑的啦,不過,如果你知道序列中不支持匿名函數(shù),那這個坑就和你say byebye了。好了話不多數(shù),直接進(jìn)入正題。
分布式進(jìn)程
正如大家所知道的Process比Thread更穩(wěn)定,而且Process可以分布到多臺機(jī)器上,而Thread最多只能分布到同一臺機(jī)器的多個CPU上。Python的multiprocessing模塊不但支持多進(jìn)程,其中managers子模塊還支持把多進(jìn)程分布到多臺機(jī)器上。一個服務(wù)進(jìn)程可以作為調(diào)度者,將任務(wù)分布到其他多個進(jìn)程中,依靠網(wǎng)絡(luò)通信。由于managers模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細(xì)節(jié),就可以很容易地編寫分布式多進(jìn)程程序。
代碼記錄
舉個例子
如果我們已經(jīng)有一個通過Queue通信的多進(jìn)程程序在同一臺機(jī)器上運(yùn)行,現(xiàn)在,由于處理任務(wù)的進(jìn)程任務(wù)繁重,希望把發(fā)送任務(wù)的進(jìn)程和處理任務(wù)的進(jìn)程分布到兩臺機(jī)器上,這應(yīng)該怎么用分布式進(jìn)程來實(shí)現(xiàn)呢?你已經(jīng)知道了原有的Queue可以繼續(xù)使用,而且通過managers模塊把Queue通過網(wǎng)絡(luò)暴露出去,就可以讓其他機(jī)器的進(jìn)程來訪問Queue了。好,那我們就這么干!
寫個task_master.py
我們先看服務(wù)進(jìn)程。服務(wù)進(jìn)程負(fù)責(zé)啟動Queue,把Queue注冊到網(wǎng)絡(luò)上,然后往Queue里面寫入任務(wù)。
#!/user/bin/pytthon # -*- coding:utf-8 -*- # @Time: 2018/3/3 16:46 # @Author: lichexo # @File: task_master.py import random, time, queue from multiprocessing.managers import BaseManager # 發(fā)送任務(wù)的隊列: task_queue = queue.Queue() # 接收結(jié)果的隊列: result_queue = queue.Queue() # 從BaseManager繼承的QueueManager: class QueueManager(BaseManager): pass # 把兩個Queue都注冊到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對象: QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue) # 綁定端口5000, 設(shè)置驗證碼'abc': manager = QueueManager(address=('', 5000), authkey=b'abc') # 啟動Queue: manager.start() # 獲得通過網(wǎng)絡(luò)訪問的Queue對象: task = manager.get_task_queue() result = manager.get_result_queue() # 放幾個任務(wù)進(jìn)去: for i in range(10): n = random.randint(0, 10000) print('Put task %d...' % n) task.put(n) # 從result隊列讀取結(jié)果: print('Try get results...') for i in range(10): r = result.get(timeout=10) print('Result: %s' % r) # 關(guān)閉: manager.shutdown() print('master exit.')
當(dāng)前文章:Python分布式進(jìn)程中你會遇到的問題解析-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://aaarwkj.com/article34/cdpese.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、服務(wù)器托管、軟件開發(fā)、動態(tài)網(wǎng)站、微信小程序、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)