-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 に答える