Python как синхронизировать потоки? - PullRequest
0 голосов
/ 12 октября 2018

Я изучаю параллельное программирование на Python.

В следующем коде у меня возникают проблемы с синхронизацией.Как я могу это исправить?

import threading
N = 1000000
counter = 0

def increment():
    global counter
    for i in range(N):
        counter += 1

t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=increment)

t1.start()
t2.start()
t1.join()
t2.join()

print(counter)

1 Ответ

0 голосов
/ 12 октября 2018

Оба потока пытаются изменить counter одновременно, а иногда и делают.Это приводит к тому, что некоторые приращения не появляются.Вот простой подход к решению этой проблемы с использованием threading.Lock:

import threading

N = 1000000
counter = 0

def increment(theLock):
    global counter
    for i in range(N):
        theLock.acquire()
        counter += 1
        theLock.release()

lock = threading.Lock()
t1 = threading.Thread(target=increment, args=[lock,])
t2 = threading.Thread(target=increment, args=[lock,])

t1.start()
t2.start()
t1.join()
t2.join()

print(counter)

Кодов окружения theLock.acquire() и theLock.release(), которые должны быть защищены, чтобы запускаться только в одном потоке за раз.В вашем примере сборка и выпуск могут также охватывать весь цикл, но это будет то же самое, что и использование многопроцессорной обработки.См. документацию по потокам и, в частности, раздел Lock Objects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...