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()