-2

我正在尝试制作一个执行此操作的程序:

  1. 在线程中调用程序 1
  2. 在另一个线程中调用程序 2
  3. 如果程序 1 先结束,则终止程序 2,反之亦然。

我已经尝试了很长时间,这些是我目前的问题:

  1. 我无法导入 Thread 模块(不是线程!)。
  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))
4

2 回答 2

2

在 python 2.7 上

import thread 

然后

thread.start_new_thread(funct,(param1, param2...))

对我有用,不知道要杀死他们,但是从您的问题来看,这就是您所坚持的吗?

在得到@JFSebastian 的反馈后,我开始研究新(旧)线程模块并修复我之前的代码以及我目前正在处理的代码。

import threading

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

不知道这是否是最强大的使用方式,但我只知道它存在 25 分钟 :)

于 2012-11-01T09:10:52.027 回答
1

要杀死所有进程,如果它们中的任何一个已经退出,您可以process.wait()在一个单独的线程中调用每个进程,并使用它threading.Event来发出任何进程是否结束的信号:

#!/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
于 2012-11-02T03:55:26.933 回答