[英]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()
msg
是Message
類的實例,它是:
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秒並終止服務器”的消息。 到目前為止我所做的。
problem line
調用self.terminate()
。 我得到AttributeError: 'NoneType' object has no attribute 'terminate'
problem line
提出一個例外。 我認為該異常是在run()
函數中捕獲的。 我錯了 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.