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()
来获取队列中的单个条目

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

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

    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
    获取作业,其他进程将不再接收该作业。这正是队列的目的:它自动处理进程之间的同步,以避免同一个作业由多个工作人员执行。