Подтвердить что ты не робот

Потоки Python. Как заблокировать поток?

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

Код:

import threading

class Thread(threading.Thread):
    def __init__(self, t, *args):
        threading.Thread.__init__(self, target=t, args=args)
        self.start()
count = 0
lock = threading.Lock()

def incre():
    global count 
    lock.acquire()
    try:
        count += 1    
    finally:
        lock.release()

def bye():
    while True:
        incre()

def hello_there():
    while True:
        incre()

def main():    
    hello = Thread(hello_there)
    goodbye = Thread(bye)

    while True:
        print count

if __name__ == '__main__':
    main()

Итак, у меня есть два потока, оба пытающихся увеличить счетчик. Я думал, что если поток "A", называемый incre(), будет установлен lock, предотвращая доступ "B" до "A".

Запуск дает понять, что это не так. Вы получаете все приращения раскола случайных данных.

Как точно используется объект блокировки?

Изменить, Кроме того, я попытался поместить блокировки внутри функций потока, но все равно не повезло.

4b9b3361

Ответ 1

Вы можете видеть, что ваши блокировки в значительной степени работают, когда вы их используете, если вы замедляете процесс и блокируете их немного больше. У вас была правильная идея, где вы окружали критические фрагменты кода с помощью блокировки. Ниже приведена небольшая корректировка вашего примера, чтобы показать вам, как каждый ждет на другом, чтобы освободить блокировку.

import threading
import time
import inspect

class Thread(threading.Thread):
    def __init__(self, t, *args):
        threading.Thread.__init__(self, target=t, args=args)
        self.start()

count = 0
lock = threading.Lock()

def incre():
    global count
    caller = inspect.getouterframes(inspect.currentframe())[1][3]
    print "Inside %s()" % caller
    print "Acquiring lock"
    with lock:
        print "Lock Acquired"
        count += 1  
        time.sleep(2)  

def bye():
    while count < 5:
        incre()

def hello_there():
    while count < 5:
        incre()

def main():    
    hello = Thread(hello_there)
    goodbye = Thread(bye)


if __name__ == '__main__':
    main()

Пример вывода:

...
Inside hello_there()
Acquiring lock
Lock Acquired
Inside bye()
Acquiring lock
Lock Acquired
...