2016-11-04 53 views
2

我逃离How can I recover the return value of a function passed to multiprocessing.Process?以下解决方案:为什么多处理在同一个进程中运行的东西?

import multiprocessing 
from os import getpid 

def worker(procnum): 
    print('I am number %d in process %d' % (procnum, getpid())) 
    return getpid() 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes = 3) 
    print(pool.map(worker, range(5))) 

这是应该的输出是这样的:

I am number 0 in process 19139 
I am number 1 in process 19138 
I am number 2 in process 19140 
I am number 3 in process 19139 
I am number 4 in process 19140 
[19139, 19138, 19140, 19139, 19140] 

而是我只得到

[4212, 4212, 4212, 4212, 4212] 

如果我喂pool.map我使用了10个以上的流程,最多使用两个不同的pid,范围为1,000,000。

为什么我的副本multiprocessing似乎在同一个过程中运行一切?

+1

你从这个例子中得到了什么样的例子?真正的情况是,要执行的代码的速度非常快,以至于强迫它在多个线程之间分割工作没有任何好处。 – Makoto

+0

在我的机器上,我相当一致地获得了所有pid的例子,并且在10个进程中执行了100个任务。所以这似乎有些依赖于上下文。 – Mark

+1

请注意['map'方法](https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.pool.Pool.map)也有一个'chunksize'参数可以用来修复发送给子进程的块的大小。所以你可以通过将'chunksize'设置为更小的值来改变行为。在任何情况下:'Pool'都是一种简单的方式来分配任务,你不关心谁执行它们等等。它的默认设置应该可以在几乎所有的情况下工作,所以不用担心这直到你发现一个真正的问题与演出...... – Bakuriu

回答

2

TL; DR:任务没有以任何方式明确分配,也许您的任务很短,它们都在其他进程开始之前完成。

从望着multiprocessing源,似乎任务只是把一个Queue,从(功能workerPool._inqueue读取)读取工作进程。目前还没有计算分配,工作人员只是争取尽可能努力工作。

那么最有可能的赌注是,由于任务只是非常短,所以一个过程完成所有的人之前,其他人有机会看起来甚至开始。您可以通过在任务中添加两秒钟sleep来轻松检查是否属于这种情况。

我会注意到,在我的机器上,任务都可以非常均匀地分布在进程上(也用于#processes> #cores)。因此,似乎有一些系统依赖性,即使所有进程在工作排队之前都应该有.start()


下面是从worker一些修整源,其示出了任务只是从每个进程队列中读取,所以在伪随机顺序:

def worker(inqueue, outqueue, ...): 
    ... 
    get = inqueue.get 
    ... 
    while maxtasks is None or (maxtasks and completed < maxtasks): 
     try: 
      task = get() 
     ... 

SimpleQueue使用Pipe进程之间进行通信从SimpleQueue构造:

self._reader, self._writer = Pipe(duplex=False) 

编辑:可能关于流程启动太慢的部分是错误的,所以我删除了它。在任何工作排队之前,所有进程都是.start() ed(可能是platform-依赖)。我无法找到当前.start()返回的过程是否已准备就绪。

+0

原来我的机器需要延迟'time.sleep(0.0005)'来获得不同的进程。 – zelusp

+0

我的猜测是'Process'返回和您的系统上可用的进程之间存在0.0005秒的延迟,但我无法在线找到它,并且我无法在我的系统上进行测试,因为没有明显的延迟。 .. – Mark

相关问题