python分布式進程
阿新 • • 發佈:2017-08-07
分配任務 pre rom turn odin time bsp process add
分布式進程可以布置在局域網之中,把安排的任務註冊到局域網內,不同主機之間就可以傳遞信息,從而分配任務和反饋,不過並不適合返回大量數據;
首先需要一個服務器server,用來存放數據,其他機器通過局域網內ip訪問到:
# -*- coding: utf-8 -*- #註冊進程,manager/server import multiprocessing from multiprocessing.managers import BaseManager from multiprocessing import freeze_support # 從BaseManager繼承的QueueManager: classQueueManager(BaseManager): pass # 發送任務的隊列: task_queue = multiprocessing.Queue() # 接收結果的隊列: result_queue = multiprocessing.Queue() # 為解決__main__.<lambda> not found問題 def get_task_queue(): return task_queue # 為解決__main__.<lambda> not found問題 def get_result_queue(): return result_queue# 把兩個Queue都註冊到網絡上, callable參數關聯了Queue對象: QueueManager.register(‘get_task_queue‘, callable=get_task_queue) QueueManager.register(‘get_result_queue‘, callable=get_result_queue) # 綁定端口5000, 設置驗證碼‘abc‘: manager = QueueManager(address=(‘192.168.10.138‘, 5000), authkey=‘abc‘) freeze_support() #manager.start() 不能正常運行時,使用以下方法作為進程通信服務器server = manager.get_server() server.serve_forever()
使用server.serve_forever()來開啟進程通信服務器,本身進程就阻塞了,永遠地作為通信數據的存儲進程。
其他進程可以訪問、修改 服務器進程的通信數據來達到傳輸信息的目的。
# _*_ coding:utf-8 _*_ """ a work manager sample """ import Queue from multiprocessing.managers import BaseManager import time class QueueManager(BaseManager): pass # 從網絡上獲取Queue QueueManager.register(‘get_task_queue‘) QueueManager.register(‘get_result_queue‘) # 連接服務器 server_addr = ‘192.168.10.141‘ print ‘Connect to server %s ...‘ % server_addr manager = QueueManager(address=(server_addr, 5000), authkey=‘abc‘) manager.connect() # 獲取Queue對象 task = manager.get_task_queue() result = manager.get_result_queue()
註意註冊到服務器的ip和端口要和通信服務器端的一致。
局域網內各進程間接地通過 服務器來交換信息。
python分布式進程