#python #multithreading
#python #многопоточность
Вопрос:
Я пытаюсь реализовать многопоточную программу на Python, и у меня возникают проблемы. Я пытаюсь разработать программу, когда программа (основной поток) получает определенную команду, счетчик программы возвращается к предыдущему числу и продолжает обратный отсчет.
Ниже приведен код, который я пытался написать:
import threading
import time
count = 0
preEvent = threading.Event()
runEvent = threading.Event()
runEvent.set()
preEvent.clear()
def pre():
global count
while True:
if event.isSet():
count -= 1
event.clear()
def doSomething():
global count
while True:
# if not runEvent.isSet():
# runEvent.wait()
print(count)
count = 1
time.sleep(1)
def main():
t1 = threading.Thread(target=pre, args=())
t2 = threading.Thread(target=doSomething, args=())
t1.start()
t2.start()
command = input("input command")
while command != 'quit':
command = input("input command")
if command == 'pre':
preEvent.set()
main()
Но я столкнулся с несколькими проблемами
-
Как заблокировать t1 одновременно, пока я вводил определенную команду
-
Как начать с начала, когда t1 восстанавливается, вместо того, чтобы начинать с заблокированной точки
Что касается вопроса 1, я попытался добавить проверку условий перед командой print (count), но если я введу команду «pre», когда программа выводит счетчик, программа все равно будет выполнять count =1 После этого программа вернется, чтобы проверить условия и заблокировать t1, но этоне достигается эффект синхронизации, который я хотел. Есть ли способ достичь этой цели?
Вопрос 2 аналогичен вопросу 1. Я надеюсь, что всякий раз, когда я ввожу команду, моя программа будет выводиться следующим образом.
1
2
3
4
pre
3
4
...
Но если t1 заблокирован после завершения инструкции печати (подсчета), когда событие будет очищено, t1 продолжит выполнение с count =1
Таким образом, результат станет следующим
1
2
3
4
pre
4
5
...
Я пытался найти информацию в Интернете, но я никогда не знал, как добавлять ключевые слова.
Существует ли метод или библиотека, которые могут выполнять эту функцию?
Я изо всех сил старался описать свою проблему, но, возможно, этого недостаточно. Если у меня есть какие-либо вопросы по моей проблеме, я могу добавить больше объяснений.
Спасибо всем за ваше терпение, чтобы прочитать мой вопрос
Ответ №1:
Модуль обработки потоков имеет метод ожидания, который будет блокироваться до тех пор, пока не будет вызван notify или notify_all . Это должно выполнить то, что вы ищете в своем первом вопросе. Для вопроса 2 вы можете либо определить функцию, которая обрабатывает случай выхода, либо просто воссоздать поток, чтобы начать с самого начала.
Ответ №2:
Просто это может работать так, может быть, помогает.
from threading import Thread, Event
count = 0
counter = Event()
def pre():
global count
counter.wait()
count -= 1
print(count)
def main():
global count
print(count)
while True:
command = input("Enter 1 to increase, Enter 2 to decrease :")
if command == "1":
t1 = Thread(target=pre, args=())
t1.start()
counter.set()
else :
count = 1
print(count)
main()