Как прослушать событие с помощью Python threading

#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()

  

Но я столкнулся с несколькими проблемами

  1. Как заблокировать t1 одновременно, пока я вводил определенную команду

  2. Как начать с начала, когда 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()