Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含无限循环的Kill进程,显然在多个操作系统上_Python_Python 3.x_Operating System_Multiprocessing_Python Unittest - Fatal编程技术网

Python 包含无限循环的Kill进程,显然在多个操作系统上

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

我有一个Python3程序,它将在linux和windows下用Python3.6+进行测试

对于这些测试,需要一个测试服务器,当测试运行时,它将作为进程(来自多处理)在后台运行。这些测试使用unittests运行

TestServer进程(称为mainloop)如下所示:

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)
问题:

  • 如果“mainloop”被终止,它能够停止并以适当的方式清理,我该如何处理
  • 对于windows和linux系统,我如何管理它
  • 对于这种测试目的(处理多个操作系统并在每个多个python版本上进行测试),什么是最佳实践

  • 非常简单,就像您可以使用
    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
    属性)。