threading.lock заставляет потоки запускаться последовательно? - PullRequest
1 голос
/ 24 марта 2019

Мой фиктивный скрипт использует две функции: одна добавляет 1, а другая вычитает 1. Я пытаюсь выполнить каждую функцию 1000000 раз асинхронно с потоками и использую блокировки, чтобы предотвратить состояние гонки.

Однако я заметил, что когда мои блокировки используются внутри самого for loop, один и тот же поток будет работать до тех пор, пока цикл не закончится, и я уверен, что потоки работают синхронно.

Вот как выглядит мой скрипт:

master_count = 0
trials = 1000
import threading

def add_count():
    global master_count
    for i in range(trials):
        with lock:
            print(threading.current_thread().getName())
            master_count += 1



def subtract_count():
    global master_count
    for i in range(trials):
        with lock:
            print(threading.current_thread().getName())

            master_count -= 1



lock = threading.Lock()

t1 = threading.Thread(target = add_count, name = 'add1' )
t2 = threading.Thread(target = add_count, name = 'add2' )
t3 = threading.Thread(target = subtract_count, name = 'subtract1' )
t4 = threading.Thread(target = subtract_count, name = 'subtract2' )

t1.start()
t2.start()
t3.start()
t4.start()


t4.join()
t2.join()
t3.join()
t1.join()

print(master_count)

Я вижу это выводится в оболочку Python (10 испытаний):

add1
add1
add1
add1
add1
add1
add1
add1
add1
add1
add2
add2
add2
add2
add2
add2
add2
add2
add2
add2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1

Я бы предположил, что если бы скрипт работал асинхронно, я бы увидел смесь имен потоков вместо этого упорядоченного вывода.

Я пытался сделать это и в цикле While, но столкнулся с той же проблемой.

Так это на самом деле работает синхронно? Если так, как я могу заставить его работать асинхронно с блокировками.

Спасибо.

...