Python Multiproccess不会同时运行并单独运行

时间:2017-04-11 15:24:29

标签: python multithreading multiprocessing

我想测试多处理调用如何同时起作用,理论上,如果我有以下代码:

procedure ShiftArrayLeft(var arr: array of Integer);
var
  i: Integer;      
  tmp: Integer;
begin
  if Length(arr) < 2 then
    exit;

  tmp := arr[0];
  for i := 0 to high(arr) - 1 do
    arr[i] := arr[i + 1];
  arr[high(arr)] := tmp;
end;

当我运行时,5个进程将单独调用worker函数并证明,在worker中生成的随机值是随机的。

但是我得到了相同的值,如下:

import multiprocessing as mp
import time
import numpy as np


def worker(word_id):
    print('hello, my word id is {}'.format(word_id))
    a = np.random.randint(0, 10)
    print(a, 'id {}'.format(word_id))
    if 6 < a < 10:
        time.sleep(4)
        print('hello again, id {}'.format(word_id))
    elif 3 < a < 6:
        time.sleep(3)
        print('hello once more, id {}'.format(word_id))
    else:
        time.sleep(1)
        print('hi, id {}'.format(word_id))


def main():
    process = [mp.Process(target=worker, args=[i]) for i in range(5)]
    for p in process:
        p.start()
    for p in process:
        p.join()

if __name__ == '__main__':
    main()
显然,我设置的随机值都一样,我不知道它是否同时运行?任何人都可以对它进行分析,并在python中正确使用multiporoccess。 (也许这是我的代码错了),我的perpose同时运行args函数,我想知道哪个进程完成。

1 个答案:

答案 0 :(得分:1)

使用multiprocessing时,每个进程都会继承父进程的状态。这包括随机数发生器的状态。一个简单的解决方案是在每个工作人员中调用random.seed(),一次在开头。如果您的系统使用系统时间播种,这可能会失败,但在例如Linux将从操作系统获取种子。