如何在 python 中的线程中终止进程?
How to kill a process within a thread in python?
好的,Class A 是线程。 Class B 打电话。我试图杀死线程内创建的多个进程(tor 和 firefox),但似乎信号只能通过主线程发送,所以它失败了,它说:
signal only works in main thread
我不是很了解线程...
import subprocess
from threading import Thread
class A(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
# CREATE TWO PROCESSES
subprocess.call(['tor'], shell=True)
subprocess.call(['firefox'], shell=True)
# ... stuff to get the pid of each process ...
# KILL'EM (the failing part)
subprocess.call(['kill -9 5431'], shell=True)
subprocess.call(['kill -9 5432')], shell=True)
class B(object):
def __init__(self):
x = A()
x.start()
if __name__ == '__main__':
B()
我不知道是否可以用 RLock 来完成。获取,然后使用信号调用 subprocess.call
并释放以继续线程执行......或者如果有更好的解决方案。任何帮助将不胜感激!!
您可以使用 Popen
对象的 terminate
(正常)和 kill
方法终止您创建的进程。某些程序(如 firefox)往往会立即 return,因此这并不总是有效。但总体思路是:
import subprocess
import threading
def kill_this(procs, hard=False):
"""kill the Popen processes in the list"""
for proc in procs:
if hard:
proc.kill()
else:
proc.terminate()
class A(threading.Thread):
"""Runs tor and firefox, with graceful termination in 10 seconds and
a hard kill in 20 seconds as needed"""
def __init__(self):
Thread.__init__(self)
def run(self):
# create processes
tor = subprocess.Popen(['tor'])
firefox = subprocess.Popen(['firefox'])
# setup timers to kill 'em
soft = threading.Timer(10, kill_this, ((tor, firefox), False))
hard = threading.Timer(20, kill_this, ((tor, firefox), True))
# wait for process exit
tor.wait()
firefox.wait()
soft.cancel()
hard.cancel()
或者,您可以使用系统调用获取要终止的进程的 pid,然后将 kill_this
转换为使用不同的 API:
import subprocess
import threading
import signal
def kill_this(procs, hard=False):
"""kill the process pids in the list"""
for proc in procs:
if hard:
os.kill(pid, signal.SIGKILL)
else:
proc.terminate(pid, signal.SIGTERM)
好的,Class A 是线程。 Class B 打电话。我试图杀死线程内创建的多个进程(tor 和 firefox),但似乎信号只能通过主线程发送,所以它失败了,它说:
signal only works in main thread
我不是很了解线程...
import subprocess
from threading import Thread
class A(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
# CREATE TWO PROCESSES
subprocess.call(['tor'], shell=True)
subprocess.call(['firefox'], shell=True)
# ... stuff to get the pid of each process ...
# KILL'EM (the failing part)
subprocess.call(['kill -9 5431'], shell=True)
subprocess.call(['kill -9 5432')], shell=True)
class B(object):
def __init__(self):
x = A()
x.start()
if __name__ == '__main__':
B()
我不知道是否可以用 RLock 来完成。获取,然后使用信号调用 subprocess.call
并释放以继续线程执行......或者如果有更好的解决方案。任何帮助将不胜感激!!
您可以使用 Popen
对象的 terminate
(正常)和 kill
方法终止您创建的进程。某些程序(如 firefox)往往会立即 return,因此这并不总是有效。但总体思路是:
import subprocess
import threading
def kill_this(procs, hard=False):
"""kill the Popen processes in the list"""
for proc in procs:
if hard:
proc.kill()
else:
proc.terminate()
class A(threading.Thread):
"""Runs tor and firefox, with graceful termination in 10 seconds and
a hard kill in 20 seconds as needed"""
def __init__(self):
Thread.__init__(self)
def run(self):
# create processes
tor = subprocess.Popen(['tor'])
firefox = subprocess.Popen(['firefox'])
# setup timers to kill 'em
soft = threading.Timer(10, kill_this, ((tor, firefox), False))
hard = threading.Timer(20, kill_this, ((tor, firefox), True))
# wait for process exit
tor.wait()
firefox.wait()
soft.cancel()
hard.cancel()
或者,您可以使用系统调用获取要终止的进程的 pid,然后将 kill_this
转换为使用不同的 API:
import subprocess
import threading
import signal
def kill_this(procs, hard=False):
"""kill the process pids in the list"""
for proc in procs:
if hard:
os.kill(pid, signal.SIGKILL)
else:
proc.terminate(pid, signal.SIGTERM)