Python Can';t终止子进程
我有以下代码:Python Can';t终止子进程,python,subprocess,python-multiprocessing,Python,Subprocess,Python Multiprocessing,我有以下代码: 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 @sta
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
我该如何终止这个过程呢?正如J.F.塞巴斯蒂安所说,
女服务员的服务
使自己神化
我无法用多处理
解决这个问题,但我用子流程
找到了一个解决方案
我正在调用subprocess.Popen(cmd)
,而不是创建multiprocessing.Process
waiterserve
可能会对自身进行后台监控(父进程已退出,无需终止)。使用waiterserve
提供的关闭其守护进程的方法。@J.F.Sebastian有办法检查它吗?您可以看到server.pid
在process.start()之后几乎没有立即运行。
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