私は同じランダムシードで同じ結果が必要なアプリケーションを持っています。しかし、random.randintはスレッドセーフではありません。私はミューテックスを試しましたが、これはうまくいきません。ここに私の実験コードは(長い単純な)です:Pythonでランダムモジュールをスレッドセーフにする
import threading
import 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()
def main():
a = []
b = []
c1 = threading.Thread(target = child, args = (10, a))
c2 = threading.Thread(target = child, args = (20, b))
c1.start()
c2.start()
c1.join()
c2.join()
c = []
d = []
c1 = threading.Thread(target = child, args = (10, c))
c2 = threading.Thread(target = child, args = (20, d))
c1.start()
c1.join()
c2.start()
c2.join()
print a == c, b == d
if __name__ == "__main__":
main()
私は、真真を印刷するためのコードにしたいが、それは偽、偽を与えるためにチャンスを立っています。スレッドセーフなランデントを作成するにはどうすればよいですか?
私はそれに気付かなかったとは思わない。あなたがグローバルロックを保持している場合は、スレッドに多くのポイントがあるわけではありません。 –