Python线程在设置停止标志时连续执行

Python线程在设置停止标志时连续执行,python,multithreading,python-2.6,pyserial,Python,Multithreading,Python 2.6,Pyserial,我正在使用Python2.6与串行端口上的设备通信。我想确保设备每10秒仍处于活动状态。我发现最好的方法是启动一个线程,每隔一段时间ping一次设备(稍后设计的其他方法将向串行端口发送配置命令,从而发送全局配置)。下面是我的代码灵感来源 当我输入“退出”时,ConnectionThread似乎只会丢失10秒的计时器,并持续发送PING消息。这是什么原因造成的,如何结束整个线程 import serial import threading ser = 0 class ConnectionThr

我正在使用Python2.6与串行端口上的设备通信。我想确保设备每10秒仍处于活动状态。我发现最好的方法是启动一个线程,每隔一段时间ping一次设备(稍后设计的其他方法将向串行端口发送配置命令,从而发送全局配置)。下面是我的代码灵感来源

当我输入“退出”时,
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()

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

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

所以,在你“退出”之前,它工作得很好,但之后,它只是无限地“ping”?正确。“退出”后,ping消息将连续发送,没有10秒的延迟。@Oilyraincloud如果您删除该循环中的串行端口,并且只打印该循环中的某个内容,是否仍会发生这种情况?我不能从我的机器上复制它。你使用的是哪个版本的Python?早于2.7的Event.wait()始终返回None。在我的系统上使用Python2.7可以很好地工作。在这方面,我支持@jonathanvillemaireKrajden。使用Python2.7我无法复制,但使用2.6我可以复制。如果self.stopped.isSet(),可能会添加一个
:在
while
循环中返回
,看看问题是否消失?