Я работаю в небольшой кусок кода, который предназначен для работы следующим образом:Пайтона, кажется, не поточно-с 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
Почему это происходит?
Большое спасибо.
Индивидуальные действия 'pop()' и 'append()' являются потокобезопасными, но не множественными вызовами 'deque', для которых требуется некоторая высокоуровневая синхронизация. И вы не можете сказать, выполняется ли только заказ 'print's'. – AChampion
Процессы даже не работают на одном и том же уровне. У каждого из них есть своя копия. Это не резьба; мы не работаем в одном общем адресном пространстве с общими объектами здесь. – user2357112
Но я знаю (потому что они печатаются до первой паузы в 1 секунду), что первые два 0s на выходе - это первые два процесса, которые читаются из очереди (параллельно). Как они могут читать 0? – baldo