1. 程式人生 > >python分布式進程

python分布式進程

分配任務 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:
class
QueueManager(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分布式進程