![](/img/trans.png)
[英]With python multiprocessing how can child process terminate another child process?
[英]Can't terminate child process
我有以下代碼:
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>
。
如何終止該程序?
正如JF 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.