Попробуйте делать это так:
import multiprocessing
def smile_detection(thread_name, counter, lock):
for x in range(10):
with lock:
counter.value +=1
print thread_name, counter.value
count = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()
x = multiprocessing.Process(target=smile_detection, args=("Thread1", count, lock))
y = multiprocessing.Process(target=smile_detection, args=("Thread2", count, lock))
x.start()
y.start()
x.join()
y.join()
Первая проблема заключается в том, что глобальные переменные не разделяются между процессами. Вам необходимо использовать механизм с некоторым типом блокировки потоковой синхронизации или синхронизации. Мы можем использовать multiprocessing.Value('i', 0)
для создания потокового, синхронизированного целочисленного значения. Мы используем наш multiprocessing.Lock()
, чтобы гарантировать, что только один поток может обновлять счетчик одновременно.
Если вы действительно хотите использовать глобальную переменную, вы можете использовать multiprocessing.Manager()
, которые могут остаться в глобальной переменной:
import multiprocessing
count = multiprocessing.Manager().Value('i', 0)
lock = multiprocessing.Manager().Lock()
def smile_detection(thread_name):
global count, lock
for x in range(10):
with lock:
counter.value +=1
print thread_name, counter.value
x = multiprocessing.Process(target=smile_detection, args=("Thread1",))
y = multiprocessing.Process(target=smile_detection, args=("Thread2",))
x.start()
y.start()
x.join()
y.join()
Но лично мне нравится первый способ лучше, как Manager()
overcomplicates это ,
Вот результат Сейчас:
$ python test.py
Thread1 1
Thread1 2
Thread1 3
Thread1 4
Thread1 5
Thread1 6
Thread1 7
Thread1 8
Thread1 9
...
Thread2 15
Thread2 16
Thread2 17
Thread2 18
Thread2 19
Thread2 20
Посмотрите на [Переменные Глобалы и многопроцессорность Python] (http: // stackoverflow.com/questions/11215554/globals-variables-and-python-multiprocessing) и [Обновления глобальной переменной для многопроцессорной обработки Python не возвращаются родителям] (http://stackoverflow.com/questions/11055303/python-multiprocessing-global-variable- обновления-не-вернулся к родителям). Глобальные переменные не разделяются между * процессами *. Это совершенно разные экземпляры python. – mhoff