调用join()时,线程挂起有问题。我要做的是使用gobackn协议在网络上发送/接收数据包,我创建了一个单独的线程来处理从服务器返回的ACK。你知道吗
我在这个方法上运行了一个线程,它检查传入的数据包并检索ACK编号,然后将该编号存储在名为self.lastAck
的init中的变量设置中。方法的简化版本:
#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协议在这里根本没有正确实现,但这是我创建它的第一步。你知道吗
根据注释,确认检查中的recvfrom调用使线程挂起。固定代码:
相关问题 更多 >
编程相关推荐