正在从计时器线程终止进程

2024-03-29 09:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我最好从代码开始问题。在

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

msgMessage类的实例,它是:

^{pr2}$

逻辑是通过TCP连接从客户端获取数据,并检查队列中的消息。消息是用来控制服务器的东西。有时我会收到这样的消息:“等3秒钟,然后终止服务器”。 到目前为止我所做的一切。在

  1. problem line呼叫self.terminate()。我明白了 AttributeError: 'NoneType' object has no attribute 'terminate'
  2. problem line处引发异常。我假设异常是在run()函数中捕获的。我是 错了
  3. 呼叫sys.exit()。它也不起作用。在

也许我的问题可以简短一点。如何从Python中的线程终止进程?在


Tags: fromimportselfqueueportdefmsgsocket
1条回答
网友
1楼 · 发布于 2024-03-29 09:28:56

为什么不使用multiprocessing.Event(您已经在导入它)并在收到终止消息时优雅地退出进程。在

为此,请将此添加到__init__

self.exit = Event()

并更改两个while循环:

^{pr2}$

while not self.exit.is_set():
    conn, addr = s.accept()
    while not self.exit.is_set()
    #...

然后在响应处理程序中:

if msg.terminate:
    self.exit.set()

这将允许代码自然地退出循环,确保调用conn.close()。在

相关问题 更多 >