Python 3.x线程挂起连接()

2024-09-27 19:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

调用join()时,线程挂起有问题。我要做的是使用gobackn协议在网络上发送/接收数据包,我创建了一个单独的线程来处理从服务器返回的ACK。你知道吗

我在这个方法上运行了一个线程,它检查传入的数据包并检索ACK编号,然后将该编号存储在名为self.lastAckinit中的变量设置中。方法的简化版本:

    #Anything not explicitly defined here is global variable
    def ack_check(self):
        ack_num = 0
        pktHdrData = '!BBBBHHLLQQLL'
        # Listening for ack number from server and store it in self.lastAck.
        while True:
            # variable also inside the __init__ method
            if (self.finish == 1):
                break
            data,address = sock.recvfrom(4096)
            clientAck = struct.unpack(pktHdrData,data)
            ackNumRecv = clientAck[9]
            self.lastAck = ackNumRecv

创建线程并处理客户端数据包发送的函数的简化版本:

    def send(self,buffer):

        # Assume packet header and all relevant data is set up correctly here
        # ...

        t1 = threading.Thread(target = self.ack_check, args=())
        t1.setDaemon = True
        t1.start()

        # All of this works perfectly and breaks as expected
        while True:
            # Packets/data get sent here and break when self.lastAck reaches a specific number. Assume this works properly and breaks


        self.finish = 1
        print("About to hang here")
        t1.join()
        return bytessent

我在打印完About to end here之后就挂了,我不知道为什么。如果我在else部分中断while True循环,我就可以让它工作,但是在我从接收器接收到所有ACK号码之前,我就结束了线程。因此,我将得到从1 ACK到32 ACK的任意值,而不是完整的32 ACK。你知道吗

我认为问题出在def ack_check(self)方法中,它不会跳出循环,即使它应该在我调用self.finish = 1之后,但每次都会挂起。你知道吗

另外,除了这两个调用自抛光以及self.lastAck公司. 我知道死锁,但我不知道在这种情况下怎么可能。你知道吗

旁注:我意识到返回N协议在这里根本没有正确实现,但这是我创建它的第一步。你知道吗


Tags: and方法selftruedataheredefcheck
1条回答
网友
1楼 · 发布于 2024-09-27 19:29:12

根据注释,确认检查中的recvfrom调用使线程挂起。固定代码:

    def ack_check(self):
        ack_num = 0
        pktHdrData = '!BBBBHHLLQQLL'
        # Listening for ack number from server and store it in self.lastAck.
        while True:
            # variable also inside the __init__ method
            if (self.finish == 1):
                break
            sock.timeout(0.2)
            try:
                data,address = sock.recvfrom(4096)
            except socket.timeout:
                break
            clientAck = struct.unpack(pktHdrData,data)
            ackNumRecv = clientAck[9]
            self.lastAck = ackNumRecv

相关问题 更多 >

    热门问题