我想测试多处理调用如何同时起作用,理论上,如果我有以下代码:
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函数,我想知道哪个进程完成。
答案 0 :(得分:1)
使用multiprocessing
时,每个进程都会继承父进程的状态。这包括随机数发生器的状态。一个简单的解决方案是在每个工作人员中调用random.seed()
,一次在开头。如果您的系统使用系统时间播种,这可能会失败,但在例如Linux将从操作系统获取种子。