gpt4 book ai didi

Python,使用远程管理器和多重处理

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:45 24 4
gpt4 key购买 nike

我想使用multiprocessing模块中的远程管理器功能在多台机器之间分配工作。我知道有第三方模块,但我想尽可能坚持使用核心。我知道对于桌面(单机),您可以使用 multiprocessing.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')

您还可以使用queue.get()来获取队列中的单个条目。

  1. 如何获取队列中的项目?当我尝试遍历队列时,我进入了无限循环。
  2. 对于 worker ,您能否将每台机器限制为每台机器 1 个作业?
  3. 由于该方法似乎是一种拉式方法,工作人员需要检查作业是否存在,因此是否有一种可以触发多处理服务器的推式方法?

最佳答案

迭代队列与执行以下操作相同:

while True:
elem = queue.get() #queue empty -> it blocks!!!

一种优雅的方式来“迭代”队列并在没有更多作业要执行时阻止工作进程是使用 None (或其他东西)作为哨兵并使用 iter(callable, sentinel) :

for job in iter(queue.get, None):
# execute the calculation
output_queue.put(result)

#shutdown the worker process

这相当于:

while True:
job = queue.get()
if job is None:
break
#execute the calculation
output_queue.put(result)
#shutdown the worker process

注意,你必须在队列中为每个工作子进程插入一个哨兵,否则会有子进程在等待它。

关于你的第二个问题,我不明白你在问什么。 BaseManager提供一个服务器来执行来自客户端的调用,因此,显然,所有请求都由同一台机器满足。或者您的意思是允许每个客户端仅执行一个请求?尽管可以“手动”实现,但我没有看到任何选择。

我不明白你的问题。 什么类似于拉方法?您能否用更多细节来重新表述您的问题,以了解“可以触发多处理服务器的推送方法”的含义?

关于Python,使用远程管理器和多重处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com