【问题标题】:Can't terminate child process无法终止子进程
【发布时间】:2014-10-13 16:58:57
【问题描述】:

我有这个代码:

class Server(object):
    servers = []

    def __init__(self, name, host, port, process):
        self.name = name.lower()
        self.host, self.port = host, port
        self.process = process
        self.pid = self.process.pid

    @staticmethod
    def register(server):
        Server.servers.append(server)

    @staticmethod
    def unregister(server):
         Server.servers.remove(server)

def start_waitress(host='0.0.0.0', port=8080):
     args = ['--port={}'.format(port),
         '--host={}'.format(host), 'yarr.wsgi:application']

    subprocess.call(['waitress-serve'] + args)

 ...

 host, port = '0.0.0.0', 8080
 process = multiprocessing.Process(target=start_waitress)
 process.start()
 Server.register(Server('waitress', host, port, process))

 ...

for server in Server.servers:
   if server.name == 'waitress':
       server.process.terminate() # Here's the problem
       Server.unregister(server)
       break

问题是我无法在启动后终止进程。

我可以终止进程的唯一方法是运行kill <pid>

如何终止该进程?

【问题讨论】:

  • waitress-serve 可能会自己守护进程(父进程已经退出,没有什么可以杀死的)。使用意味着waitress-serve 提供关闭其守护进程。
  • @J.F.Sebastian 有办法检查吗?
  • 您可以看到server.pidprocess.start() 之后几乎没有立即运行。

标签: python subprocess python-multiprocessing


【解决方案1】:

正如 J.F. Sebastian 所说,waitress-serve 守护着自己。

我无法使用 multiprocessing 解决这个问题,但我找到了使用 subprocess 的解决方案。

我没有创建multiprocessing.Process,而是调用subprocess.Popen(cmd)

class Server(object):
    servers = []

    def __init__(self, name, host, port, pipe):
        self.name = name.lower()
        self.host, self.port = host, port
        self.pipe = pipe

    @staticmethod
    def register(server):
        Server.servers.append(server)

    @staticmethod
    def unregister(server):
        Server.servers.remove(server)

def start_waitress(host='0.0.0.0', port=8080):
    args = ['--port={}'.format(port),
         '--host={}'.format(host), 'yarr.wsgi:application']

    return subprocess.Popen(['waitress-serve'] + args)

...

host, port = '0.0.0.0', 8080
Server.register(Server('waitress', host, port, start_waitress()))

...

for server in Server.servers:
  if server.name == 'waitress':
      server.pipe.terminate()
      server.pipe.wait()
      Server.unregister(server)
      break

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2016-11-22
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多