我最好从代码开始问题。在
from multiprocessing import Process, Event, Queue
from threading import Timer
from Queue import Empty
class MyServer(Process):
def __init__(self, port, queue):
Process.__init__(self)
self.port = port
self.queue = queue
self.sd = None
def run(self):
try:
self.start_serving()
except keyboardInterrupt:
print("Shutting down..")
finally:
if self.sd is not None:
self.sd.close()
def start_serving(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sd = s
try:
s.bind(('', self.port))
s.listen(1)
while True:
conn, addr = s.accept()
while True:
# I dont want to bore you with excess code
# just recv data from clients
try:
msg = self.queue.get_nowait()
# here i start Timer with delay from message (I'll describe Message class below)
Timer(msg.delay, self.response_handler, args=(conn, msg)).start()
except Empty:
pass
conn.close()
finally:
s.close()
def response_handler(self, sd, msg):
# doesn't matter
# and now I want to terminate the MyServer instance
if msg.terminate:
# the problem is here. Lets call it 'problem line'
sys.exit()
msg
是Message
类的实例,它是:
逻辑是通过TCP连接从客户端获取数据,并检查队列中的消息。消息是用来控制服务器的东西。有时我会收到这样的消息:“等3秒钟,然后终止服务器”。 到目前为止我所做的一切。在
problem line
呼叫self.terminate()
。我明白了
AttributeError: 'NoneType' object has no attribute 'terminate'
problem line
处引发异常。我假设异常是在run()
函数中捕获的。我是
错了sys.exit()
。它也不起作用。在也许我的问题可以简短一点。如何从Python中的线程终止进程?在
为什么不使用
multiprocessing.Event
(您已经在导入它)并在收到终止消息时优雅地退出进程。在为此,请将此添加到
__init__
:并更改两个
^{pr2}$while
循环:到
然后在响应处理程序中:
这将允许代码自然地退出循环,确保调用
conn.close()
。在相关问题 更多 >
编程相关推荐