У меня есть thread1, thread2 и thread3, глобальная переменная x
и три разные функции для увеличения x
,
import threading
import time
#check = threading.Condition()
x=1
def add_by1():
global x
x+=1
time.sleep(1)
print(x)
def add_by2():
x+=2
time.sleep(1)
print(x)
def add_by3():
x+=3
time.sleep(1)
print(x)
if __name__==__main__:
threading.Thread(target=add_by1).start()
threading.Thread(target=add_by2).start()
threading.Thread(target=add_by3).start()
# I want the output should print..
"""
2
4
7
8
10
13
14
16
19
and so on ..
"""
можно ли использовать Condition()
, если да то как? Могу ли я использовать другие классы потоков? Как мне вставить некоторые коды в эти функции?
Я просто думаю, может быть, это решит проблему
Я думаю, что этот подход надежен. Вы можете синхронизировать свои потоки, используя три объекта lock
— по одному для каждого.
Эта установка работает следующим образом: каждый поток получает свою блокировку и, выполнив свою работу, освобождает блокировку следующего потока! IOW, add_by1
выпускает thread_lock_two
, add_by2
выпускает thread_lock_three
и, наконец, add_by3
выпускает thread_lock_one
.
Первоначально вам нужно получить thread_lock_two
и thread_lock_three
блокировку, чтобы только первый поток выполнял свою работу.
Всякий раз, когда условие выполняется (вы сказали x == 20
), каждый поток должен снова снимать блокировку следующего потока return
!
import threading
from time import sleep
x = 1
thread_lock_one = threading.Lock()
thread_lock_two = threading.Lock()
thread_lock_three = threading.Lock()
thread_lock_two.acquire()
thread_lock_three.acquire()
def add_by1():
global x
while True:
thread_lock_one.acquire()
if x >= 20:
thread_lock_two.release()
return
x += 1
print(x)
sleep(0.6)
thread_lock_two.release()
def add_by2():
global x
while True:
thread_lock_two.acquire()
if x >= 20:
thread_lock_three.release()
return
x += 2
print(x)
sleep(0.6)
thread_lock_three.release()
def add_by3():
global x
while True:
thread_lock_three.acquire()
if x >= 20:
thread_lock_one.release()
return
x += 3
print(x)
sleep(0.6)
thread_lock_one.release()
if __name__ == "__main__":
threading.Thread(target=add_by1).start()
threading.Thread(target=add_by2).start()
threading.Thread(target=add_by3).start()
вывод:
2
4
7
8
10
13
14
16
19
20
как я мог убить потоки тогда? могу ли я выйти () при достижении определенного значения x?
@fardV Я переписал ответ, используя другой подход. Таким образом, потоки уничтожаются, когда выполняется условие или, например, x
достигает 20.
очень креативно и круто!! большое спасибо за решение этой проблемы!!
Для чего вы хотите использовать
threading.Condition
? Вы читали о том, что делает условие в многопоточной среде?