Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 其中一个线程有时不会停止_Python_Multithreading_Sockets_Client - Fatal编程技术网

Python 其中一个线程有时不会停止

Python 其中一个线程有时不会停止,python,multithreading,sockets,client,Python,Multithreading,Sockets,Client,我有两个程序,一个是服务器监听连接,然后接收数据并确认它们。这一个很简单,我没有问题 import socket, sys, time LEN = 32 class TCPserver: def __init__(self): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverport = 11123 server_socket.bind(("",

我有两个程序,一个是服务器监听连接,然后接收数据并确认它们。这一个很简单,我没有问题

import socket, sys, time
LEN = 32
class TCPserver:
    def __init__(self):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serverport = 11123
        server_socket.bind(("", serverport))    
        server_socket.listen(5)
        print "mimslistener waiting for client on server '%s' - port %s" % (socket.gethostname(),serverport)
        while 1:
            self.st = ""
            self.oldPktNo = -1
            self.client_socket, address = server_socket.accept()
            count = -1
            while 1:
                try:
                    count += 1
                    data = self.client_socket.recv(LEN)
                    # create error on the transmission
                    if count in [2, 8, 20,30,40]:
                        time.sleep(0.5)
                    elif count in [1, 5, 11, 13,23,33,43]:
                        continue         
                    sentStr = "{:{width}s}".format(self.checkData(data), width=16)
                    self.client_socket.send(sentStr)
                except socket.error, e:
                    print e
                    break

    def checkData(self, data):
        try:
            if int(data[0:10]) <= self.oldPktNo: 
                return "ACK%010d" % self.oldPktNo
            strdata = data[10:]
            self.st += strdata
            self.oldPktNo = int(data[0:10])
            return "ACK%010d" % self.oldPktNo
        except Exception,e:
            return "AGAIN" 

if __name__ == "__main__":
    TCPserver()            
然而,有时只有一个线程完成,我不知道其他线程在那个时候在做什么。有人能给我解释一下,帮我解决吗


测试:先运行服务器程序,然后运行客户端程序。单击“发送行”开始发送数据,然后单击“取消”停止发送数据。单击活动状态以检查哪些线程仍然处于活动状态。对于前几行send和cancel,您可以得到两个线程的状态False,这正是我所期望的。大约在第3次或第4次,其中一个线程将为真

我发现了问题所在。那个时候服务器丢失了一些数据包,并没有发送ACK。如果由于monitor flag=-1,monitorThread已经停止,则程序无法重新发送数据包。sendPktsThread一直在等待接收ACK,并且永远不会得到该ACK。所以我更改了程序,让monitorThread继续重新发送数据包,直到sendPktsThread完全停止

def monitorThread(self):
    global monitor
    try:
        self.client_socket.send( self.createPkt(self.data[self.no], self.no) )
    except Exception, e:
        print "error in monitorThread: ", e
        self.result = -1
        monitor = -2
穿线任务

def run(self):
    global monitor
    if self.funcalled == 0:
        while monitor > -1:
            self.parent.sendPktsThread()
        print "Done with sendPktsThread - monitor=%s" % monitor
        monitor = -2
    else:
        while monitor > -2:
            time.sleep(0.5)
            self.parent.monitorThread()  
        print "Done with monitorThread - monitor=%s" % monitor
        self.parent.client_socket.close()

您是否尝试过将threads daemon属性设置为True?@plover:在您的评论之后,我尝试过这样做,但它只在我关闭程序时帮助完成线程,而不是在我单击“取消”按钮时
def run(self):
    global monitor
    if self.funcalled == 0:
        while monitor > -1:
            self.parent.sendPktsThread()
        print "Done with sendPktsThread - monitor=%s" % monitor
        monitor = -2
    else:
        while monitor > -2:
            time.sleep(0.5)
            self.parent.monitorThread()  
        print "Done with monitorThread - monitor=%s" % monitor
        self.parent.client_socket.close()