我正在试图弄清楚如何在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个过程中的每一个都会这样做,但我不能完全理解这个程序的结构。
有人能为我提供一些有关基本结构的教育观点吗?
提前谢谢。
答案 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)
您应该使用主从(也称为农民工)模式。初始过程将是主要过程并创建作业。它
从属进程从队列中连续读取并执行作业(可能直到它们从队列接收到停止消息)。在这种情况下,无需使用Manager对象,AFAICT。