多处理:运行具有多个进程的数组?

时间:2017-10-31 00:09:54

标签: python multithreading multiprocessing python-2.x

如何并行运行具有多个进程(例如2)的数组? 例如,我有这段代码:

from multiprocessing import Process, Value
import time, os

n=Value('i', 0)

l=[1, 2, 3, 4, 5]

def fun():
  try:
        while True:
            #time.sleep(0.01)   not used, explanation below
            print os.getpid(), l[n.value]
            n.value+=1
  except:
        return

for i in range(2):
    p=Process(target=fun)
    p.start()

预期输出应该是:

111 1
112 2
111 3
112 4
111 5

但我得到了:

111 1
111 2
111 3
111 4
111 5

只有一个进程在数组中运行。

我只是通过将time.sleep()置于任何非常小的值来获得预期结果,但如果可能的话,我正在寻找没有它的解决方案。

1 个答案:

答案 0 :(得分:1)

问题是因为您的任务执行得太快,第一个进程在第二个进程启动之前就完成了。这就是为什么把sleep()“调用”修复“事情 - 这是因为它减慢了任务的速度,足以让第二次有足够的时间开始,所以他们可以同时运行一段时间

如果您将l列表放得更大,可以在代码中看到这一点,比如l = range(1, 1001)

为了进一步说明这一点,下面是代码的修改版本,它还显示最终它们将同时运行。它还会打印出有关每项任务内容的更多信息:

from multiprocessing import Process, Value
import time, os

n = Value('i', 0)
l = [1, 2, 3, 4, 5]

def fun(cycles):
    assert cycles >= 0
    while cycles:
        try:
            while True:
                with n.get_lock():
                    print os.getpid(), l[n.value]
                    n.value += 1
        except IndexError:
            print('list index out of range exception occurred, resetting "n"')
            with n.get_lock():  # Reset for another cycle
                n.value = 0
        except Exception as exc:
            print('unexpected exception {} occurred'.format(exc))
            break
        cycles -= 1

    print('{} task terminating'.format(os.getpid()))


if __name__ == '__main__':
    cycles = 100
    for i in range(2):
        p = Process(target=fun, args=(cycles,))
        p.start()

    print('done')