Python线程问题

Python线程问题,python,multithreading,Python,Multithreading,我正在尝试制作一个程序来实现这一点: 在线程中调用程序1 在另一个线程中调用程序2 如果程序1先结束,则终止程序2,反之亦然 我已经尝试了很长时间,这是我目前的问题: 我无法导入线程模块(不是线程!) 函数还是类,这是个问题 我已经知道如何使用subprocess.Popen调用进程,以及如何使用命令行函数终止它们。我还知道如何获取PID 这是我的实际代码: import threading, subprocess, shlex class Prog1(threading.Thread):

我正在尝试制作一个程序来实现这一点:

  • 在线程中调用程序1
  • 在另一个线程中调用程序2
  • 如果程序1先结束,则终止程序2,反之亦然
  • 我已经尝试了很长时间,这是我目前的问题:

  • 我无法导入线程模块(不是线程!)
  • 函数还是类,这是个问题
  • 我已经知道如何使用subprocess.Popen调用进程,以及如何使用命令行函数终止它们。我还知道如何获取PID

    这是我的实际代码:

    import threading, subprocess, shlex
    
    class Prog1(threading.Thread):
        def __init__(self, arg=''):
            self.arg = arg
            threading.Thread.__init__(self)
    
        def run(self):
            p = subprocess.Popen(shelx.split(self.arg))
            global p.pid
            subprocess.Popen(shelx.split("kill -9 " + q.pid))
    
    
    class Prog2(threading.Thread):
        def __init__(self, arg=''):
            self.arg = arg
            threading.Thread.__init__(self)
    
        def run(self):
            q = subprocess.Popen(shelx.split(self.arg))
            global q.pid
            subprocess.Popen(shelx.split("kill -9 " + p.pid))
    
    关于python 2.7

    import thread 
    
    然后

    对我有用,不知道杀了他们,但从你的问题来看,这就是你一直坚持的

    从@J.F.Sebastian收到反馈后,我开始研究新的(旧的)线程模块,并修复我以前的代码和我目前正在处理的代码

    import threading
    
    t=threading.Thread(target=fuct, args=(param1, param2...)).start()
    

    我不知道这是否是使用它的最可靠的方法,但我只知道它存在了25分钟:)

    要杀死所有进程,如果其中任何进程已退出,您可以在单独的线程中调用每个进程,并使用它来发信号通知任何进程是否已结束:

    #!/usr/bin/env python
    import shlex
    import subprocess
    import threading
    
    
    def kill_all(processes):
        for p in processes:
            try:
                if p.poll() is None:
                    p.kill()  # note: it may leave orphans
                    p.wait()
            except:  # pylint: disable=W0702
                pass  # ignore whatever it is (including SIGINT)
    
    
    def wait(process, exit_event):
        try:
            process.wait()
        finally:
            exit_event.set()  # signal the process has exited
    
    
    def main():
        # start processes
        cmd = "/bin/bash -c 'echo start {0}; sleep {0}; echo done {0}'".format
        processes = []
        for i in range(1, 3):
            try:
                processes.append(subprocess.Popen(shlex.split(cmd(i))))
            except EnvironmentError:
                kill_all(processes)  # failed to start some process; kill'em all
                return 1  # error
    
        # wait until at least one process finishes
        exit_event = threading.Event()
        for p in processes:
            threading.Thread(target=wait, args=(p, exit_event)).start()
    
        exit_event.wait()
        kill_all(processes)
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())
    
    输出
    欢迎来到这个网站!我们很想帮助您,但如果没有更多关于您尝试过的内容的信息,以及您被困的确切位置,这是不可能的。向我们展示你的代码会有所帮助。试着编一个简单的例子来再现你的问题。
    线程
    模块是.@J.F.Sebastian新标准是什么?我并没有过多地关注最新情况,只是在遇到问题时用谷歌搜索,看看有什么效果。
    #!/usr/bin/env python
    import shlex
    import subprocess
    import threading
    
    
    def kill_all(processes):
        for p in processes:
            try:
                if p.poll() is None:
                    p.kill()  # note: it may leave orphans
                    p.wait()
            except:  # pylint: disable=W0702
                pass  # ignore whatever it is (including SIGINT)
    
    
    def wait(process, exit_event):
        try:
            process.wait()
        finally:
            exit_event.set()  # signal the process has exited
    
    
    def main():
        # start processes
        cmd = "/bin/bash -c 'echo start {0}; sleep {0}; echo done {0}'".format
        processes = []
        for i in range(1, 3):
            try:
                processes.append(subprocess.Popen(shlex.split(cmd(i))))
            except EnvironmentError:
                kill_all(processes)  # failed to start some process; kill'em all
                return 1  # error
    
        # wait until at least one process finishes
        exit_event = threading.Event()
        for p in processes:
            threading.Thread(target=wait, args=(p, exit_event)).start()
    
        exit_event.wait()
        kill_all(processes)
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())
    
    start 1
    start 2
    done 1