python - 简单的多线程服务器客户端程序
问题描述
我有一个用于简单游戏的多线程服务器和客户端程序。每当客户端退出游戏时,我都会尝试通过 try catch "except BrokenPipeError" 捕获异常并通知其他玩家。我也想结束退出的客户端线程;但是,我接受这样的输入:
while True:
client = serverSocket.accept()
t = ServerThread(client)
t.start()
我尝试使用带有 stop() 函数的线程事件;但是,由于我接受输入的方式,我相信我不能使用 .join 语句退出线程。我应该如何结束强制退出的客户端。我知道多处理库有一个终止功能,但我也需要使用线程库。我试过 os_exit(1) 但我相信这个命令会杀死整个过程。诸如此类的程序的标准退出过程是什么?
解决方案
首先join()
什么都不做,只是等待线程停止。线程在到达线程子例程的末尾时停止。例如
class ServerThread(threading.Thread):
def __init__(self,client,name):
super().__init__(self)
self.client = client
self.name = name
def inform(self,msg):
print("{}: got message {}".format( self.name, msg ))
self.client[0].send(msg)
def run(self):
while True:
try:
self.client[0].recv(1024)
except BrokenPipeError: #client exits
# do stuff
break # -> ends loop
return # -> thread exits, join returns
如果您想通知其他客户有人离开,我会创建另一个监控线程
class Monitoring(threading.Thread):
def __init__(self):
super().__init__(self,daemon=True) # daemon means thread stops when main thread do
self.clients=[]
def add_client(self,client):
self.clients.append(client)
def inform_client_leaves(self,client_leaved):
for client in self.clients:
if client.is_alive():
client.inform("Client '{}' leaves".format(client_leaved.name))
def run(self):
while True:
for thread in list(self.threads):
if not thread.is_alive(): # client exited
self.threads.remove(thread)
self.inform_client_exits(thread)
time.sleep(1)
所以初始代码看起来像
mon = Monitoring()
mon.start()
while True:
client = serverSocket.accept()
t = ServerThread(client,"Client1")
t.start()
mon.add_client(t)
推荐阅读
- botframework - Adaptive Cards : Dynamic data binding on Action.Show Card
- java - 错误:启动应用程序时,java.lang.ClassCastException LinearLayout$LayoutParams cannot be cast
- elasticsearch - 如何使用 Curl 将 scroll_id 发送到 ElasticSearch
- pine-script - 松脚本中的移动平均线
- jquery - 在页面刷新时停止jquery倒计时重置?
- r - 为什么 sf 对象不能使用 R 中的所有 data.table 方法?
- php - 基于先前选择从 mysql 中选择 HTML
- javascript - Javascript使用数组的主键添加新列
- file - Jenkinsfile 中的 Groovy:如何创建文件并填充字节 [] 的内容
- qt - QT。qt中的点图