测试多处理调用如何同时工作,理论上,如果我有以下代码:
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()
当我运行时,5 进程将单独调用 worker 函数,为了证明这一点,worker 中生成的随机值将是随机的。
但是我只是得到了相同的值,如下所示:
hello, my word id is 0
2 id 0
hello, my word id is 1
2 id 1
hello, my word id is 2
2 id 2
hello, my word id is 3
2 id 3
hello, my word id is 4
2 id 4
hi, id 3
hi, id 0
hi, id 1
hi, id 2
hi, id 4
显然,我设置的随机值都是一样的,我无法判断它是否同时运行?任何人都可以分析它并给我一个正确的 python 多孔用法。(也许是我的代码错误(,我的主张是同时运行一个带有 args 的函数,我想知道哪个进程完成。
使用 multiprocessing
时,每个进程都继承父进程的状态。这包括随机数生成器的状态。一个简单的解决方案是在每个工作人员中调用random.seed()
,在开始时调用一次。如果您的系统使用系统时间进行种子设定,这可能会失败,但在例如 Linux 上可以很好地工作,它将从操作系统获取种子。