1

だから私はsubprocess、Djangoを使用してWebインターフェースを介して長時間実行されるプロセスを生成するために使用しています. ユーザーがページに戻りたい場合はsubprocess、後で終了するオプションを提供したいと思います。

どうすればこれを行うことができますか?Java で同じことを実装し、プロセス オブジェクトをメモリに格納するグローバル シングルトン ProcessManager ディクショナリを作成しました。Pythonで同様のことを行うことはできますか?

編集

はい、シングルトンと ProcessManager のハッシュは、それをきれいに行う方法です。Emmanuel のコードは、いくつかの変更を加えるだけで問題なく動作します。

ありがとう

4

2 に答える 2

1

Python でシングルトン パターンを実装する簡単な方法は、クラス属性を使用することだと思います。

import subprocess

class ProcessManager(object):
    __PROCESS = None;

    @staticmethod
    def set_process(args):
        # Sets singleton process
        if __PROCESS is None:
            p = subprocess.Popen(args)
            ProcessManager.__PROCESS = p;
        # else: exception handling

    @staticmethod
    def kill_process():
        # Kills process
        if __PROCESS is None:
            # exception handling
        else:
            ProcessManager.__PROCESS.kill()

次に、次の方法でこのクラスを使用できます。

from my_module import ProcessManager

my_args = ...
ProcessManager.set_process(my_args)

...

ProcessManager.kill_process()

ノート:

  • プロセスのProcessManager作成を担当し、その終了と対称になるようにします
  • これがマルチスレッドモードで機能するかどうかを知るには、マルチスレッドに関する十分な知識がありません
于 2013-02-04T09:59:35.533 に答える
1

Java で行ったのと同じ手法を Python でも使用できます。つまり、プロセスへの参照をモジュール変数に格納するか、一種のシングルトンを実装します。

Java とは対照的に、Python にはサーブレット仕様との豊富な類似性がなく、アプリケーションの開始または終了を処理するインターフェースがないという唯一の問題があります。ほとんどの場合、永続ストレージからすべてのデータをフェッチするため、実行中のアプリケーションのインスタンス数を心配する必要はありません。ただし、この場合、アプリケーションがどのようにデプロイされるかを理解する必要があります。

アプリケーションの単一の長時間実行インスタンス (たとえば、FastCGI インスタンス、または cherrypy 上の単一の WSGI アプリケーション) がある場合、プロセス処理機能を別のモジュールに分離し、モジュールのインポート時にそれをロードできます (任意のモジュールアプリケーション内で 1 回だけインポートされます)。多くのインスタンス (多くの FastCGI インスタンス、または単純な CGI スクリプト) がある場合は、子プロセスを切り離し、それらの ID を永続的なストレージ (データベースまたはファイル) に保持し、それらを現在実行中のプロセスのリストと交差させる必要があります。オンデマンド。

于 2013-02-04T17:03:54.497 に答える