Оба потока пытаются изменить 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
.