Python,使用远程管理器和多处理
我想使用Python,使用远程管理器和多处理,python,multiprocessing,Python,Multiprocessing,我想使用多处理模块中的远程管理器功能在多台机器之间分配工作。我知道有第三方模块,但我希望尽可能坚持核心。我知道对于台式机(单机),您可以使用多处理.Pool类来限制CPU的数量,但对远程管理器有几个问题 我有远程管理器的以下代码: from multiprocessing.managers import BaseManager import Queue queue = Queue.Queue() class QueueManager(BaseManager): pass
多处理
模块中的远程管理器功能在多台机器之间分配工作。我知道有第三方模块,但我希望尽可能坚持核心。我知道对于台式机(单机),您可以使用多处理.Pool
类来限制CPU的数量,但对远程管理器有几个问题
我有远程管理器的以下代码:
from multiprocessing.managers import BaseManager
import Queue
queue = Queue.Queue()
class QueueManager(BaseManager): pass
QueueManager.register('get_queue', callable=lambda:queue)
m = QueueManager(address=('', 50000), authkey='abracadabra')
s = m.get_server()
s.serve_forever()
这非常有效,我甚至可以使用以下代码将作业提交到队列中:
QueueManager.register('get_queue')
m = QueueManager(address=('machinename', 50000), authkey='abracadabra')
m.connect()
queue = m.get_queue()
queue.put('hello')
您还可以使用队列.get()
来获取队列中的单个条目
迭代队列与执行以下操作相同:
while True:
elem = queue.get() #queue empty -> it blocks!!!
当没有更多作业可执行时,在队列上“迭代”并阻止工作进程的一种优雅方法是使用None
(或其他)作为哨兵,并使用iter(可调用,哨兵)
:
这相当于:
while True:
job = queue.get()
if job is None:
break
#execute the calculation
output_queue.put(result)
#shutdown the worker process
请注意,您必须在QUU中为每个辅助子流程插入一个哨兵,否则将有子流程等待它
关于你的第二个问题,我不明白你在问什么。BaseManager
提供了一个服务器来执行来自客户端的调用,因此,显然,所有请求都由同一台机器来满足。
或者,您的意思是只允许每个客户机执行一个请求?我看不到任何选项,即使它可以“手工”实现
我不明白你的问题。什么是拉法?您能否将您的问题重新表述为“可触发多处理服务器的推送方法”的详细含义?在队列上迭代与执行以下操作相同:
while True:
elem = queue.get() #queue empty -> it blocks!!!
当没有更多作业可执行时,在队列上“迭代”并阻止工作进程的一种优雅方法是使用None
(或其他)作为哨兵,并使用iter(可调用,哨兵)
:
这相当于:
while True:
job = queue.get()
if job is None:
break
#execute the calculation
output_queue.put(result)
#shutdown the worker process
请注意,您必须在QUU中为每个辅助子流程插入一个哨兵,否则将有子流程等待它
关于你的第二个问题,我不明白你在问什么。BaseManager
提供了一个服务器来执行来自客户端的调用,因此,显然,所有请求都由同一台机器来满足。
或者,您的意思是只允许每个客户机执行一个请求?我看不到任何选项,即使它可以“手工”实现
我不明白你的问题。什么是拉法?你能用更详细的话来重新表述你的问题吗?你说的“可以触发多处理服务器的推送方法”是什么意思?谢谢你的迭代方法。所以我想我的问题是,假设你有一个始终运行的远程管理器,并且你有多个工作人员。确保只有一台工人机器执行一项工作的最佳方法是什么?是否有办法手动将作业分配给工人机器?当工作计算机使用get()提取作业时,该作业是否从队列中删除?@josh1234一旦通过
get
获取作业,其他进程将不再接收该作业。这正是队列的目的:它自动处理进程之间的同步,以避免同一个作业由多个工作人员执行。感谢您提供的迭代方法。因此我想我的问题是,假设您有一个始终运行的远程管理器,并且您有多个工作人员。确保只有一台工人机器执行一项工作的最佳方法是什么?是否有办法手动将作业分配给工人机器?当工作计算机使用get()提取作业时,该作业是否从队列中删除?@josh1234一旦通过get
获取作业,其他进程将不再接收该作业。这正是队列的目的:它自动处理进程之间的同步,以避免同一个作业由多个工作人员执行。