【问题标题】:Python thread continuously executes when setting stop flag设置停止标志时Python线程连续执行
【发布时间】:2014-09-29 19:23:57
【问题描述】:

我正在使用 Python 2.6 与串行端口上的设备进行通信。我想确保设备每 10 秒仍然处于活动状态。我发现做到这一点的最好方法是启动一个经常 ping 设备的线程(其他方法,稍后设计,将从串行端口发送配置命令,因此是全局的)。下面是我的代码灵感来自here

当我输入“退出”时,ConnectionThread 似乎只丢失了 10 秒计时器并不断发送 PING 消息。是什么原因造成的,我该如何结束整个线程?

import serial
import threading

ser = 0

class ConnectionThread(threading.Thread):
    def __init__(self, event, **kwargs):
        threading.Thread.__init__(self)
        self.stopped = event
        for key, value in kwargs.items():
            setattr(self, key, value)

    def run(self):
        while not self.stopped.wait(10):
            ser.write("{0},{1}\r".format(self.name,"PING"))

def main():           
    global ser
    commport = input("Enter COM port:")

    try:            
        ser = serial.Serial(
                            port = 'COM{0}'.format(commport),
                            baudrate = 9600
                            )
    except:
        print "Unable to open com port!"

    stopFlag = threading.Event()
    thread = ConnectionThread(stopFlag)
    thread.start()  

    while True:
        n = raw_input("Enter input:")
        if n == "quit":
            stopFlag.set()
            break

if __name__ == "__main__":
    main()

【问题讨论】:

  • 所以在你“退出”之前,它工作正常,但之后,它只是无限地“ping”?
  • 正确。 “退出”后,ping 消息会连续发送,没有 10 秒延迟。
  • @Oilyraincloud 如果您删除此串行端口部分,并且仅删除该循环中的 print 某些内容,是否还会发生这种情况?我无法从我的机器上以这种方式复制它。
  • 您使用的是哪个版本的 Python?在 2.7 之前,Event.wait() 总是返回 None。在我的系统上使用 python 2.7 可以正常工作。
  • 我支持@JonathanVillemaire-Krajden。使用 Python 2.7 我无法重现,但使用 2.6 我可以。也许在while 循环中添加一个if self.stopped.isSet(): return,看看问题是否消失?

标签: python multithreading python-2.6 pyserial


【解决方案1】:

因为您使用的是 Python 2.6,所以 Event.wait() 始终返回 None。您需要在 while 循环中明确检查 Event 的状态:

while not self.stopped.wait(10):
    if self.stopped.isSet():
        return
    ser.write("{0},{1}\r".format(self.name,"PING"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多