Can't understand the behaviour of threads in python. I was interesting about thread safety of np.memmap(), and wrote some example:
from multiprocessing import Process
import numpy as np
import time
mm = np.memmap("foo", dtype=int, mode = "w+", shape = (10,))
def foo(i):
while True:
mm[1]=np.random.randint(low=2, high=50)
sleepfor = np.random.uniform(low=0.0, high=1.1, size=None)
print "proces = ", i, " value = ", mm[1], " sleep = ", sleepfor
time.sleep(sleepfor)
if __name__ == "__main__":
processes = []
p1 = Process(target=foo, args=(1,))
p1.start()
p2 = Process(target=foo, args=(2,))
p2.start()
p3 = Process(target=foo, args=(3,))
p3.start()
p4 = Process(target=foo, args=(4,))
p4.start()
It outputs this:
proces = 1 value = 13 sleep = 0.91652869794
proces = 2 value = 13 sleep = 0.91652869794
proces = 3 value = 13 sleep = 0.91652869794
proces = 4 value = 13 sleep = 0.91652869794
proces = 1 value = 6 sleep = 0.721062383299
proces = 2 value = 6 sleep = 0.721062383299
proces = 3 value = 6 sleep = 0.721062383299
proces = 4 value = 6 sleep = 0.721062383299
proces = 1 value = 24 sleep = 0.161040327399
proces = 2 value = 24 sleep = 0.161040327399
proces = 3 value = 24 sleep = 0.161040327399
proces = 4 value = 24 sleep = 0.161040327399
proces = 1 value = 22 sleep = 0.837121791675
proces = 2 value = 22 sleep = 0.837121791675
proces = 3 value = 22 sleep = 0.837121791675
proces = 4 value = 22 sleep = 0.837121791675
and so on...
Why random values are the same for different processes?
Why they change every 4 iterations?
And also how to write a test to check if numpy memmap is thread safe (is it?)
UPD:
Ok, random.seed() solves issue number one and number two? Then I commented sleep() to cause writing concurrency and also no errors occured. Does it mean that np.memmap() thread safe?