0

Я работаю в небольшой кусок кода, который предназначен для работы следующим образом:Пайтона, кажется, не поточно-с multiprocessing.Pool

  • произвольное число процессов (например, 10).
  • Поскольку у меня есть два потока, я хочу запустить их по два за раз.
  • Я хочу, чтобы они прочитали значение из очереди. Очередь содержит только два разных значения, и я хочу, чтобы оба процесса работали одновременно с чтением этих разных значений.

Например, рассмотрим следующий пример кода:

import collections 
import time 

q = collections.deque() 
q.append(0) 
q.append(1) 

def f(i): 
    d = q.popleft() 
    print d 
    time.sleep(1) 
    q.append(d) 

from multiprocessing import Pool 
t = Pool(2) 
t.map(f, range(10)) 

При выполнении этого, я ожидаю, что первая пара процессов читать 0 и 1 соответственно. На самом деле я не обращаю внимания на порядок их печати (0, 1 или 1, 0). Однако выход выглядит следующим образом:

0 
0 
1 
1 
0 
0 
1 
1 
0 
1 

Почему это происходит, если deque является потокобезопасным? Кроме того, первые 8 значений печатаются 2 за раз в 1 секунду, но для последних 2 значений также существует пауза в 1 секунду между ними. Чтобы прояснить это, позвольте мне сделать паузы в 1 секунду как дефисы:

0 
0 
- 
1 
1 
- 
0 
0 
- 
1 
1 
- 
0 
- 
1 

Почему это происходит?

Большое спасибо.

+1

Индивидуальные действия 'pop()' и 'append()' являются потокобезопасными, но не множественными вызовами 'deque', для которых требуется некоторая высокоуровневая синхронизация. И вы не можете сказать, выполняется ли только заказ 'print's'. – AChampion

+1

Процессы даже не работают на одном и том же уровне. У каждого из них есть своя копия. Это не резьба; мы не работаем в одном общем адресном пространстве с общими объектами здесь. – user2357112

+0

Но я знаю (потому что они печатаются до первой паузы в 1 секунду), что первые два 0s на выходе - это первые два процесса, которые читаются из очереди (параллельно). Как они могут читать 0? – baldo

ответ

0

Процессы не делят память.

В вашем примере каждый процесс работает на собственной копии deque. Синхронизация между ними вообще отсутствует.

Для достижения нужного результата вы можете использовать объект multiprocessing.Queue.

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