使用可更新队列进行多处理

时间:2009-08-24 15:34:13

标签: python queue multiprocessing

我正在试图弄清楚如何在python中编写一个使用多处理队列的程序。

我有多台服务器,其中一台将远程提供队列:

from multiprocessing.managers import BaseManager
import Queue
import daemonme

queue = Queue.Queue()

class QueueManager(BaseManager):
    pass

daemonme.createDaemon()
QueueManager.register('get_job', callable=lambda:queue)
m = QueueManager(address=('', 50000), authkey='')
s = m.get_server()
s.serve_forever()

现在我想使用我的双Xeon四核服务器来处理远程队列中的作业。这些工作完全相互独立。因此,如果我有8个内核,我想启动7个进程,从队列中选择一个作业,处理它,然后返回下一个。 7个过程中的每一个都会这样做,但我不能完全理解这个程序的结构。

有人能为我提供一些有关基本结构的教育观点吗?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

查看doc如何从manager检索队列(第17.6.2.7段) 与工作人员pool(第17.6.2.9段)相比,工作人员将7个工作岗位排到每个工作岗位。

另外,你可以认为像生产者/消费者问题:

from multiprocessing.managers import BaseManager
import random

class Producer():
def __init__(self):
    BaseManager.register('queue')
    self.m = BaseManager(address=('hostname', 50000), authkey='jgsjgfdjs')
    self.m.connect()
    self.cm_queue = self.m.queue()
    while 1:
        time.sleep(random.randint(1,3))
        self.cm_queue.put(<PUT-HERE-JOBS>)

from multiprocessing.managers import BaseManager
import time
import random
class Consumer():
def __init__(self):
    BaseManager.register('queue')

    self.m = BaseManager(address=('host', 50000), authkey='jgsjgfdjs')
    self.m.connect()
    self.queue = self.m.queue()
    while 1:
        <EXECUTE(job = self.queue.get())>


from multiprocessing.managers import BaseManager, Queue
class Manager():

def __init__(self):

    self.queue = QueueQueu()

    BaseManager.register('st_queue', callable=lambda:self.queue)

    self.m = BaseManager(address=('host', 50000), authkey='jgsjgfdjs')
    self.s = self.m.get_server()

    self.s.serve_forever()

答案 1 :(得分:0)

您应该使用主从(也称为农民工)模式。初始过程将是主要过程并创建作业。它

  1. 创建一个队列
  2. 创建7个从属进程,将队列作为参数传递
  3. 开始将作业写入队列
  4. 从属进程从队列中连续读取并执行作业(可能直到它们从队列接收到停止消息)。在这种情况下,无需使用Manager对象,AFAICT。