Почему мои блокировки потоков не работают должным образом? - PullRequest
0 голосов
/ 14 апреля 2020

Для задания я должен создать простую многопоточную программу, в которой есть три потока, которые ожидают случайное количество времени (от 0,1 до 2 секунд) и затем выводят «конец». Я пытаюсь использовать блокировки, чтобы предотвратить неправильное переключение выходных данных, но мой вывод все еще выглядит случайным (то есть блокировки не работают должным образом). Мой код:

import time
from threading import *
import random

lock = Lock()

def one():
    global lock
    time.sleep((random.randint(1,20))/10)
    lock.acquire()
    print("1. end")
    lock.release()

def two():
    global lock
    time.sleep((random.randint(1,20))/10)
    lock.acquire()
    print("2. end")
    lock.release()

def three():
    global lock
    time.sleep((random.randint(1,20))/10)
    lock.acquire()
    print("3. end")
    lock.release()


for i in range(0,100):
    t1 = Thread(target = one)
    t2 = Thread(target = two)
    t3 = Thread(target = three)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()

, но мой вывод:

 2. end
 3. end
 1. end
 3. end
 2. end
 2. end
 1. end
 3. end
 1. end
 etc...

что я делаю не так?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы получаете замок после случайного сна:

import time
from threading import *
import random

lock = Lock()

def one():
    global lock
    lock.acquire()
    time.sleep((random.randint(1,20))/10)
    print("1. end")
    lock.release()

def two():
    global lock
    lock.acquire()
    time.sleep((random.randint(1,20))/10)
    print("2. end")
    lock.release()

def three():
    global lock
    lock.acquire()
    time.sleep((random.randint(1,20))/10)
    print("3. end")
    lock.release()


for i in range(0,100):
    t1 = Thread(target = one)
    t2 = Thread(target = two)
    t3 = Thread(target = three)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...