如何在新的shell中启动多处理器中的每个worker?

问题描述:

我试图将一个工作池中产生的进程的执行情况耦合到一个新的系统终端。在下面的例子中(改编自@ sylvain-leroux对this问题的回答)构建了一个工作人员池,以便与排队的对象一起工作。如何在新的shell中启动多处理器中的每个worker?

import os 
import time 
import multiprocessing 

# A main function, to be run by our workers. 
def worker_main(queue): 
    print('The worker at', os.getpid(), 'is initialized.') 
    while True: 

     # Block until something is in the queue. 
     item = queue.get(True) 
     print(item) 
     time.sleep(0.5) 

if __name__ == '__main__': 

    # Instantiate a Queue for communication. 
    the_queue = multiprocessing.Queue() 

    # Build a Pool of workers, each running worker_main. 
    the_pool = multiprocessing.Pool(3, worker_main, (the_queue,)) 

    # Iterate, sending data via the Queue. 
    for i in range(5): 
     the_queue.put("That's a nice string you got there.") 
     the_queue.put("It'd be a shame if something were to... garble it.") 

    worker_pool.close() 
    worker_pool.join() 
    time.sleep(10) 

如果从系统终端运行此,你会看到一堆乱码的,因为每个工人正在写出来,并在执行,同一个控制台。对于我正在处理的项目,生成一个新的外壳/控制台来承载每个工作进程将非常有用,例如,所有打印的输出都显示在该外壳中,并且工作进程的执行是该外壳中的主机。我已经看到了几个使用shell关键字执行Popen的示例,但由于兼容性限制,我需要坚持基于池的实现。有没有人在这里做过?感谢指导。

+0

在Linux上,您可以写入单独的文件并手动打开shell以使用命令'watch -n 1 cat file.txt'来每隔一秒显示新的文件内容。 – furas

+0

谢谢@furas。这是一个有用的习语。我通常在Linux上工作,但我希望这个解决方案能够跨平台扩展。另外,虽然这会让我访问打印的信息,但它不会导致执行被绑定到监视shell,这对我的应用程序来说是可取的。 –

尝试使用Queue反过来。

让工作人员put邮件进入Queue,并在父进程get他们从Queue并打印出来。这应该摆脱混合输出。

如果您想要将消息从父母传递给工作人员并返回,请使用两个队列。一个用于将消息传递给工作人员,另一个用于将消息传递给父级。

+0

这是Queue的一个有趣的用法,我没有考虑 - 它可能会派上用场。不幸的是,它不会在这种情况下。我仍然需要通过那个队列将只有父进程的信息传递给工作人员,以便做有用的工作。在这个例子中,所有的工作人员都是印刷品,但实际上他们会用这些信息做些事情。我试图从池中实例化的终端中分离产生的工作进程。乱码文本是耦合的症状,但不是全部问题。我已经修改了这个问题,以便更清楚。谢谢! –

+0

@JustinFletcher然后只用两个'队列'。查看更新的答案。 –