【发布时间】:2019-08-20 15:14:40
【问题描述】:
我想让每个进程产生随机数,但我希望它们在运行中可重现。
这里是示例代码:
import random
from multiprocessing import Process
random.seed(2019)
def f2():
print('from f2:')
v = random.randint(0, 10)
a = random.randint(0, 10)
print('v:', v)
return v, a
def python_process_test():
n_workers = 2
workers = []
for i in range(n_workers):
p = Process(target=f2, args=())
p.start()
workers.append(p)
for p in workers:
p.join()
if __name__ == '__main__':
python_process_test()
这不是所希望的行为,因为运行中的值不同:
运行 1:
from f2:
v: 6
from f2:
v: 4
运行 2:
from f2:
v: 0
from f2:
v: 5
更新:
import time
import random
from multiprocessing import Process
random.seed(2019)
def get_random_sleep_time_v1():
return random.randint(0,3)
def get_random_sleep_time_v2():
from datetime import datetime
random.seed(datetime.now())
return random.randint(0,3)
def f2(rnd_seed, process_id):
random.seed(rnd_seed)
# To rundomize order in which process will print
sleep_time = get_random_sleep_time_v1()
#sleep_time = get_random_sleep_time_v2()
time.sleep(sleep_time)
print('process_id:', process_id)
v = random.randint(0, 10)
a = random.randint(0, 10)
print('v:', v)
return v, a
def python_process_test():
n_workers = 4
workers = []
for i in range(n_workers):
rnd_seed = random.randint(0,10)
p = Process(target=f2, args=(rnd_seed,i))
p.start()
workers.append(p)
for p in workers:
p.join()
if __name__ == '__main__':
python_process_test()
使用get_random_sleep_time_v1 我得到了想要的行为,但进程的顺序不会因运行而改变:
run 1:
process_id: 0
v: 1
process_id: 3
v: 1
process_id: 1
v: 9
process_id: 2
v: 2
run 2:
process_id: 0
v: 1
process_id: 3
v: 1
process_id: 1
v: 9
process_id: 2
v: 2
使用get_random_sleep_time_v2 的进程顺序是随机的,但生成的值在运行中不一致:
run 1:
process_id: 3
v: 10
process_id: 1
v: 8
process_id: 2
v: 7
process_id: 0
v: 6
run 2:
process_id: 0
v: 8
process_id: 3
v: 10
process_id: 2
v: 10
process_id: 1
v: 8
【问题讨论】:
-
这与您的预期有何不同?
-
@FredLarson 查看更新。
-
那么您还有问题吗,或者您是否将解决方案编辑到问题中(应该是答案)?
-
@FredLarson 在顶部“我想让每个进程产生随机数,但我希望它们在运行中可重现。”
-
如果你想让睡眠时间随机但仍然使用
rnd_seed,请在调用get_random_sleep_v2()之后加上random.seed(rnd_seed)。
标签: python random process python-multiprocessing random-seed