Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 SocketServer死锁问题_Python_Python 2.7_Deadlock_Socketserver - Fatal编程技术网

Python SocketServer死锁问题

Python SocketServer死锁问题,python,python-2.7,deadlock,socketserver,Python,Python 2.7,Deadlock,Socketserver,当我对SocketServer实例(永远服务方法)执行线程时,我可以在发送文本“shutdown”时轻松退出它,这正是我所期望的。然而,如果它没有线程,那么我会遇到它锁定的问题,我不知道如何绕过这个问题 服务器本身的基本流程是开始->侦听->获取数据->从中获取命令->运行命令(这是一个插件)->返回结果。以下是我使用的代码: 将SocketServer导入为SS NULL_RESP={“状态”:False,“数据”:“未收到数据”。} 类ASWCP_守护进程(SS.BaseRequestHan

当我对SocketServer实例(永远服务方法)执行线程时,我可以在发送文本“shutdown”时轻松退出它,这正是我所期望的。然而,如果它没有线程,那么我会遇到它锁定的问题,我不知道如何绕过这个问题

服务器本身的基本流程是开始->侦听->获取数据->从中获取命令->运行命令(这是一个插件)->返回结果。以下是我使用的代码:

将SocketServer导入为SS
NULL_RESP={“状态”:False,“数据”:“未收到数据”。}
类ASWCP_守护进程(SS.BaseRequestHandler):
def句柄(自身):
self.data=self.request.recv(1024).strip()
如果self.data==“”:
self.request.sendall(json.dumps(NULL_RESP))
一无所获
tmp=self.data.split(“,1)
cmd=tmp[0]
args=“”
尝试:
args=str(tmp[1]).split(conf.command\u parse)
除:
通过
plugin=plugins[“cmd”][cmd]['ref'].init(conf=conf,socket=self)
尝试:
如果参数[0]=“帮助”:
self.request.sendall(plugin.help)
除索引器外:
状态,数据=plugin.run(args)
resp={“状态”:状态,“数据”:数据}
self.request.sendall(json.dumps(resp))
如果名称=“\uuuuu main\uuuuuuuu”:
#在这里创建日志;conf=config文件(与此问题无关)
尝试:
如果conf.tcp:
如果conf.threaded:
导入线程
类threadedtcserver(SS.ThreadingMixIn,SS.TCPServer):
通过
server=ThreadedTCPServer((conf.host,conf.listen\u端口),ASWCP\u守护进程)
其他:
server=SS.TCPServer((conf.host,conf.listen\u端口),ASWCP\u守护进程)
其他:
server=SS.UDPServer((conf.host,conf.listen\u端口),ASWCP\u守护进程)
如果conf.threaded:
sthread=threading.Thread(target=server.serve\u)
#sthread.daemon=True
sthread.start()
其他:
服务器。永远为您服务()
除键盘中断外:
通过
关机插件的运行方法如下:

def运行(self,*args,**kwargs):
如果self.socket==无:
打印“>无可用插座”
返回(假,“”)
其他:
self.socket.log.info(“关闭守护进程”)
self.socket.server.shutdown()
返回(True,“”)
如果线程化,这是好的,如果不是,那么它将到达插件中的
self.socket.server.shutdown()
方法
self.socket
是ASWCP_守护进程类的实例。

#执行关闭()如果线程化,则执行服务器关闭()
如果self.sysconf.threaded:
self.socket.server.shutdown()
其他:
self.socket.server.server\u close()
返回(True,“”)
self.sysconf
是守护进程的配置(
conf
在问题的代码中),而
self.socket
是对流处理程序的引用。

\Do shutdown()如果线程化,则执行服务器关闭()
如果self.sysconf.threaded:
self.socket.server.shutdown()
其他:
self.socket.server.server\u close()
返回(True,“”)

self.sysconf
是守护进程的配置(
conf
在问题代码中),而
self.socket
是对流处理程序的引用。

您能发布完整的问题代码吗?此代码缩进不正确(只需从编辑器中粘贴它,高亮显示它,然后在此处按
Ctrl+K
),并且未定义
conf
,它缺少实际关闭,并且包含不相关的代码(与线程相关的任何内容,因为禁用线程时会出现问题).对不起,我一直很忙,所以没有机会回复。我修正了它,让它成为这个问题的答案。你能发布完整的有问题的代码吗?此代码缩进不正确(只需从编辑器中粘贴它,高亮显示它,然后在此处按
Ctrl+K
),并且未定义
conf
,它缺少实际关闭,并且包含不相关的代码(与线程相关的任何内容,因为禁用线程时会出现问题).对不起,我一直很忙,所以没有机会回复。我把它修好了,让它成为这个问题的答案。