其他人指出了random
以线程安全方式使用的正确方法。但是我觉得必须指出,您编写的代码对任何内容都不是线程安全的。
def child(n, a):
g_mutex = threading.Lock()
g_mutex.acquire()
random.seed(n)
for i in xrange(100):
a.append(random.randint(0, 1000))
g_mutex.release()
每个线程都独立运行此方法。这意味着每个线程都在创建自己的锁实例,获取它,进行工作,然后释放它。除非每个线程都试图获取相同的锁,否则没有什么可以确保非并行执行的。您需要将单个值分配给g_mutex
run方法的上下文之外。
:
我只是想补充一点,不能保证仅切换到全局锁就可以完全按照您说的做。该锁将确保一次只有一个线程在生成数字,但是不能保证哪个线程将首先启动。