简体   繁体   English

如何在python中删除线程内的进程?

[英]How to kill a process within a thread in python?

Ok, Class A is the Thread. 好的,A类是线程。 Class B does the call. B级打电话。 I tried to kill more than one process (tor, and a firefox) created inside the thread but seems that signals can only be send throught the main thread, so it failed, It says: 我试图杀死在线程内创建的多个进程(tor和firefox),但似乎信号只能通过主线程发送,所以它失败了,它说:

signal only works in main thread

I don't really understand threads well... 我不太了解线程......

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

I don't know if it could be done with an RLock. 我不知道是否可以用RLock完成。 Acquire, then call the subprocess.call with the signal and release to continue with the thread execution... Or if there's a better solution. 获取,然后使用信号调用subprocess.call并释放以继续执行线程......或者如果有更好的解决方案。 Any help would be greatly appreciated !! 任何帮助将不胜感激 !!

You can kill processes you created by using the terminate (graceful) and kill methods of the Popen object. 您可以使用Popen对象的terminate (graceful)和kill方法来terminate您创建的进程。 Some programs like firefox tend to return immediately, so this doesn't always work. 像firefox这样的程序往往会立即返回,所以这并不总是有效。 But the general idea is: 但总的想法是:

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

Alternately, you can use system calls to get the pid of the process you want to kill and then convert kill_this to use a different API: 或者,您可以使用系统调用来获取要杀死的进程的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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM