2015-09-29 6 views
0

Не удается понять поведение потоков в python. Я было интересно о безопасности резьбы np.memmap(), и написал несколько примеров:Numpy memmap и несколько процессов

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() 

Он выводит это:

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... 

Почему случайные значения одинаковы для разных процессов?

Почему они меняют каждые 4 итерации?

А также, как написать тест, чтобы проверить, если NumPy memmap потокобезопасен (это?)

UPD:

Ok, random.seed() решает вопрос номер один и номер два? Затем я прокомментировал sleep(), чтобы вызвать параллелизм записи, а также не было ошибок. Означает ли это, что np.memmap() поток безопасен?

ответ

1

Я думаю, что это проблема с np.random, хотя я не знаю почему. Если вы используете mm[1] = random.randint(1, 20), вместо этого он исправляет проблему того, что значение одинаково для всех процессов.

>>> proces = 1 value = 17 sleep = 0.0967840686219 
>>> proces = 2 value = 13 sleep = 0.0967840686219 
>>> proces = 3 value = 19 sleep = 0.0967840686219 
>>> proces = 4 value = 14 sleep = 0.0967840686219 

Использование random.random также фиксирует ту же проблему для переменной sleep.

+0

Извините, почему голос? – kezzos

+0

Я не голосовал. Это не я. – user3003873

+0

Значения в порядке. Но я тоже старался сделать сон. Это же сталь. – user3003873

Смежные вопросы