2

デーモン スレッドが実行されているかどうかをテストするという難しい問題に行き詰まっています。作成したデーモン スレッドは、サービスを実行し続けるためにバックグラウンドで実行する必要があるため、次のようにして作成し、存続させます。

作成:

ASThread = threading.Thread(target = initAirserv, args=[],)
ASThread.setDaemon(True)
ASThread.start()

メソッドの内部initAirserv():

def initAirserv(self, channel="15"):
        interface = self.execAirmon(options="start", interface=self.interface)
        port = self.plug_port
        if interface != "removed":
            if channel=="15":
                command = "airserv-ng -d " +str(interface)+" -p "+str(port)
            else:
                command = "airserv-ng -d " +str(interface)+" -p "+str(port)+" -c"+str(channel)
        else:
            return None
        AServConn=self.init_Plug()
        if AServConn:
            (stdin, stdout, stderr) = AServConn.exec_command(command)
            serv_op = stdout
            serv_er = stderr
            ##### keep the daemon thread run persistently ####
            a = 0 
            while 1:
                a += 1
        else:
            logging.debug( "SSH Error" )

最後の数行の目的は、愚かな方法を使用してスレッドをビジー状態に保つことです。ただし、このデーモンスレッドを開始して別のことをした後、戻ってきてスレッドを次のように確認しました。

if ASThread.is_alive() == 1:
    # do something

if 本体は決して実行されません。誰かが私になぜこれが起こるのか説明できますか? 常にビジーである必要がある何かを実行するスレッドを実行する最良の方法は何ですか? どうもありがとう。

4

2 に答える 2

2

投稿されたコードは合算されません。initAirserv投稿されたのはクラスのメソッドですが、コンストラクターにinitAirserv渡されるのはそうではありません。Thread

execAirmonまた、アプリケーションで何が何をするのか、そしてinit_Plug他に何が起こるのかを知らずに具体的なことを言うのは難しいです。

一般的に、私はあなたがそれを正しく持っていると思います。これは機能するはずです。それがあなたの仮定が間違っているという意味ではないという事実。

  • execAirmon「削除された」と等しくないものを返しますか?
  • init_Plugfalse以外のオブジェクトを返しますか?
  • 例外がスローされないことを確認しますか?(私はあなたが偽のスタックトレースに気付くと思います、それであなたのアプリケーションの他の部分がそれらを気づかれずに飲み込む可能性がありますか?)
于 2012-03-21T21:27:06.800 に答える
0

私の情報の一部は数か月前のものであり、状況が変わっている可能性がありますので、ご容赦ください.

標準の C ベースの Python を使用していて、マルチスレッド アプリケーションを作成している場合は、Global Interpreter Lock (GIL) の制限に注意する必要があります。つまり、一度に実行できるスレッドは 1 つだけです。Python C インターフェイス パッケージの 1 つを使用し、多くのコードを C で記述したい場合は、関数呼び出しの C 部分をスレッド化することができ、GIL の制限を受けません。

Python には優れたマルチプロセス サポートとライブラリがあり、プロセスを同期しているため、GIL の制限は適用されません。

GIL 制限を修正することについての話がありますが、今のところ、これは受け入れなければならない問題です。

私見ですが、非常に具体的な問題に対処する必要がない限り、C ではなく Python でソフトウェアを作成するために Python を選択しました。Python は多くの点で優れた言語ですが、GIL の制限により、より優れたイベント同期をサポートする言語 (別名マルチスレッド環境) を学ぶようになりました。

これが役立つことを願っています。

于 2012-03-21T17:56:49.083 に答える