簡體   English   中英

從Timer線程終止進程

[英]Terminating process from Timer thread

我最好從代碼開始這個問題。

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類的實例,它是:

class Message(object):
    def __init__(self, port, delay, values, terminate=False):
        self.port = port
        self.delay = delay
        self.values = values
        self.terminate = terminate

邏輯是我通過TCP連接從客戶端獲取數據,然后檢查“隊列”以獲取消息。 消息是控制服務器的事物。 有時我會收到類似“等待3秒並終止服務器”的消息。 到目前為止我所做的。

  1. problem line調用self.terminate() 我得到AttributeError: 'NoneType' object has no attribute 'terminate'
  2. problem line提出一個例外。 我認為該異常是在run()函數中捕獲的。 我錯了
  3. 調用sys.exit() 它也不起作用。

也許我的問題可以更短。 如何在Python中從其線程終止進程?

如果收到終止消息,為什么不使用multiprocessing.Event (已經將其導入)並優雅地退出該過程。

為此,請將其添加到__init__

self.exit = Event()

並更改兩個while循環:

while True:
    conn, addr = s.accept()
    while True:
    #...

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

然后在您的響應處理程序中:

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

這將使代碼自然退出循環,確保conn.close()被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM