2017-02-20 5 views
-1

私はPythonで同時に2つの関数を実行しようとしています。両方の関数にはwhileループが含まれています。私はスレッドとマルチプロセッシングを喜んで使用しようとしました。 1つの関数だけが実行されます。私はスタックとネットでいくつかの例を読んで試しました。どんな助けもありがとう。前もって感謝します。私はPythonが初めてです。あなたの例ではマルチスレッドを使用してPythonでwhileループを同時に含む2つの関数を実行する

if __name__ == "__main__": 
    ap = argparse.ArgumentParser() 
    ap.add_argument("-c", "--conf", required=True, 
     help="path to the JSON configuration file") 
    args = vars(ap.parse_args()) 
# p1 = Process(target=main(args)) 
# p2 = Process(target=cameraHandler(args)) 
# p1.start() 
# p2.start() 

    threadA = Thread(target = main(args)) 
    threadB = Thread(target = cameraHandler(args)) 
    threadA.run() 
    threadB.run() 

    threadA.join() 
    threadB.join() 
+0

「同時に」機能を本当に実行するには、「マルチプロセッシング」を使用する必要があります。また、 '//'はPythonのコメントではないことに気付きたいと思います。 '#'を望みます。 –

+0

@ juanpa.arrivillagaこれは素晴らしい答えです。そして、あなたが知っているように、マルチスレッドを使って実現できます。また、私は##がPythonのコメントであることを知っています。偉大な答えdoh、あなたは明らかにたくさん知っている!なぜあなたは否定的なコメントではなく、その質問に対する解決策を提示しませんでしたか? – Wazzi

+0

GILは1つのスレッドだけがインタプリタで実行されることを保証しているので、あなたは2つの関数*を同時に実行したいと言っているため、CPythonでは 'マルチスレッド 'を使用することはできません。一度。本当にマルチコア・アーキテクチャーを活用し、並列に実行したい場合は、マルチプロセッシングを使用する必要があります。 APIは非常に似ているので、実際にはそれが問題であれば、コードを簡単に変換できるはずです。私はあなたにdownvoteしなかった。 –

答えて

0

、あなたはtarget = main(args)target = cameraHandler(args)を持っています。どちらの場合も、スレッドをそのまま残すのではなく、関数自体を呼び出すことになります。したがって、最初のものだけが呼び出され、threadAは決して作成されません。関数自体(maincameraHandler)をThread,に転送するには、を呼び出す必要があります。この問題を解決するには

Threadためargsキーワード引数を使用します。また.start()メソッドをThreadにする必要があります。

Thread(target=main, args=(args,)).start() 
Thread(target=cameraHandler, args=(args,)).start() 

これはargsは、あなたがの各機能に渡すしたい単一の引数であると仮定しています。 のタプルの場合は、すべての引数を渡します。args=argsを使用してください。たとえば、スレッドをf(1, 2, 3)に実行する場合は、Thread(target=f, args=(1, 2, 3))を使用します。

+0

スレッドはデーモンではありませんか?私が正しくリコールすれば、スレッドがデーモンでなければ、Pythonはスレッドが終了するのを待つでしょう –

+0

@OwainvanBrakel私のテストによれば、スレッドをデーモン化せずに動作します。 :) –

+0

私はそれを期待していませんでした...返事をありがとう! –

関連する問題