Python 包含无限循环的Kill进程,显然在多个操作系统上
我有一个Python3程序,它将在linux和windows下用Python3.6+进行测试 对于这些测试,需要一个测试服务器,当测试运行时,它将作为进程(来自多处理)在后台运行。这些测试使用unittests运行 TestServer进程(称为mainloop)如下所示:Python 包含无限循环的Kill进程,显然在多个操作系统上,python,python-3.x,operating-system,multiprocessing,python-unittest,Python,Python 3.x,Operating System,Multiprocessing,Python Unittest,我有一个Python3程序,它将在linux和windows下用Python3.6+进行测试 对于这些测试,需要一个测试服务器,当测试运行时,它将作为进程(来自多处理)在后台运行。这些测试使用unittests运行 TestServer进程(称为mainloop)如下所示: def mainloop(somearg): server = mylib.server.Server() # some initialisation stuff server.start()
def mainloop(somearg):
server = mylib.server.Server()
# some initialisation stuff
server.start()
while True: # How to break/handle this if process shall be killed?
while True: # How to break/handle this if process shall be killed?
event = server.get_event()
if event:
logger.info(event)
else:
break
time.sleep(1)
server.stop() # never been reached
server.cleanup() # never been reached
from multiprocessing import Process
from mylib import mainloop
# some other stuff
@classmethod
def setUpClass(cls):
cls.process = Process(target=mainloop)
cls.process.start()
time.sleep(2) # wait for server to start
@classmethod
def tearDownClass(cls):
kill(cls.process.pid,1)
我的setUpClass如下所示:
def mainloop(somearg):
server = mylib.server.Server()
# some initialisation stuff
server.start()
while True: # How to break/handle this if process shall be killed?
while True: # How to break/handle this if process shall be killed?
event = server.get_event()
if event:
logger.info(event)
else:
break
time.sleep(1)
server.stop() # never been reached
server.cleanup() # never been reached
from multiprocessing import Process
from mylib import mainloop
# some other stuff
@classmethod
def setUpClass(cls):
cls.process = Process(target=mainloop)
cls.process.start()
time.sleep(2) # wait for server to start
@classmethod
def tearDownClass(cls):
kill(cls.process.pid,1)
问题:
非常简单,就像您可以使用
kill
终止服务器进程一样
你可以给它发个信号。如果您的服务器进程已经注册了一个信号处理程序。然后它可以优雅地退出
但这只适用于类Unix系统(有些信号在Windows中无法实现)。如果希望程序在类似Windows/Unix的系统上运行,可以将信号
机制扩展到更通用的RPC
例如,使用TCP套接字侦听端口。当您想从外部关闭服务器时,向其发送一条消息。基本上有两种方法可以正确关闭服务器
os.kill
功能,您确实发送了一个停止服务器进程的信号,这非常棒
但是你需要对你的代码做一些调整,这样它就会像你想要的那样工作。
首先,让我们定义您想要什么:
tearDownClass
将向服务器发送停止的信号一,
我没有使用windows,因此无法测试它,如果信号不工作,请尝试SIGILL如何将信号处理程序集成到mainloop进程?如何将信号机制扩展到更通用的RPC(我知道它是什么,做什么,但我自己从未编程过)?有Python构建方式吗?这看起来可以理解。因此,在任何操作系统情况下,我都必须处理if/elses,也许还需要处理python版本?这在任何python 3.6+上都适用,就像您在问题上所说的那样。if/else就足够了,因为所有*nix操作系统都会返回“posix”,而windows不会返回(即,关于
OS.name
属性)。