如何使用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)命令之前添加条件检查,但是如果我在程序输出count时输入“pre”命令,程序仍然会执行count+=1之后,程序会返回到检查条件并阻止t1,但这并没有达到我想要的同步效果。有办法实现这个目标吗?

问题2与问题1类似。我希望每当我输入命令时,我的程序都会像这样输出。

1

2

3

4

pre

3

4

...

但如果t1在执行完print(count)指令后被阻塞,当事件清除后,t1将从count+=1开始继续执行,所以输出将变成以下


1

2

3

4

pre

4

5

...

我尝试在网上查找信息,但始终不知道如何添加关键字。有没有方法或库可以实现这个功能?


我已尽力描述我的问题,但可能还不够好。如果我对我的问题有任何疑问,我可以添加更多解释。


倚天杖
浏览 128回答 2
2回答

天涯尽头无女友

线程模块有一个等待方法,该方法将阻塞直到调用notify或notify_all 。这应该可以完成您在第一个问题中寻找的内容。对于问题 2,您可以定义一个处理退出情况的函数,或者只是重新创建一个线程以从头开始。

largeQ

简单地说,它可以像这样工作,也许有帮助。from threading import Thread, Eventcount = 0counter = 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python