web-dev-qa-db-ja.com

2つの機能を同時に実行する

2つの機能を同時に実行しようとしています。

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()

誰もこれを行う方法を知っていますか?

36
John

これを行う:

from threading import Thread

def func1():
    print 'Working'

def func2():
    print 'Working'

if __== '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
67
chrissygormley

スレッド化についての答え は良いですが、やりたいことについてもう少し具体的にする必要があります。

両方とも多くのCPUを使用する2つの関数がある場合、スレッド化(CPythonで)はおそらくどこにも行かないでしょう。次に、 multiprocessing module をご覧になるか、jython/IronPythonを使用することをお勧めします。

CPUにバインドされたパフォーマンスが理由である場合は、(スレッド化されていない)Cで実装することもでき、Pythonで2つの並列処理を行うよりもはるかに高速化できます。

より多くの情報がなければ、良い答えを見つけるのは簡単ではありません。

10
Mattias Nilsson

1つのオプション。2つの関数を同時に実行するように見えます
time
threading モジュールを使用しています(例: this answer)。

ただし、公式Python Documentation
ページ の説明。使用してみると良いモジュールは multiprocessing です。

また、非同期実行に使用できる他のPythonモジュール)(同時に動作する2つのコード)。それらに関するいくつかの情報と選択方法については、 this Stack Overflow questionを参照してください。

threadingモジュールに関する別のユーザーからのコメント

彼はグローバル通訳ロックのためにそれを知りたいかもしれません
これらのマシンは、マシンが
questionには複数のCPUがあります。 wiki.python.org/moin/GlobalInterpreterLock

–ジョナス・エルフストローム 10年6月2日11時39分

threadingモジュールが機能しないというドキュメントからの引用

CPython実装の詳細:CPythonでは、グローバルインタープリターによる
ロック、1つのスレッドのみがPythonコードを一度に実行できます
特定のパフォーマンス指向ライブラリがこの制限を克服する可能性があります)。

アプリケーションでマルチコアマシンの計算リソースをより有効に使用する場合は、multiprocessingまたはconcurrent.futures.ProcessPoolExecutorを使用することをお勧めします。
ただし、スレッド化は依然として適切なモデルです
複数のI/Oバウンドタスクを同時に実行したい。

4
Edward

これは、Pythonコードを簡単に並列化および配布できるシステムである Ray を使用してエレガントに行うことができます。

サンプルを並列化するには、関数を_@ray.remote decorator_で定義してから、_.remote_で関数を呼び出す必要があります。

_import ray

ray.init()

# Define functions you want to execute in parallel using 
# the ray.remote decorator.
@ray.remote
def func1():
    print("Working")

@ray.remote
def func2():
    print("Working")

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])
_

func1()およびfunc2()が結果を返す場合、ray.get([func1.remote(), func2.remote()])を次のように置き換えて、上記のコードを少し書き換える必要があります。

_ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])
_

multiprocessing モジュールよりもRayを使用したり、マルチスレッドを使用したりすることには多くの利点があります。特に、同じコードは、単一のマシンとマシンのクラスターで実行されます。

Rayのその他の利点については、 この関連記事 を参照してください。

2
Ion Stoica

あなたが伝えようとしていることは、マルチプロセッシングによって達成できると思います。ただし、スレッドを介して実行する場合は、これを実行できます。これは役立つかもしれません

from threading import Thread
import time

def func1():
    print 'Working'
    time.sleep(2)

def func2():
    print 'Working'
    time.sleep(2)

th = Thread(target=func1)
th.start()
th1=Thread(target=func2)
th1.start()
0
Soham Kapoor

スレッドモジュールはマルチプロセスとは異なり同時に動作しますが、タイミングは少しずれています。以下のコードは、「1」と「2」を出力します。これらはそれぞれ異なる関数によって呼び出されます。コンソールに印刷すると、タイミングが少し異なることに気付きました。

   from threading import Thread

   def one():
       while(1 == num):
           print("1")
           time.sleep(2)

   def two():
       while(1 == num):
           print("2")
           time.sleep(2)


   p1 = Thread(target = one)
   p2 = Thread(target = two)

   p1.start()
   p2.start()

出力:(スペースは印刷間の待機用であることに注意してください)

   1
   2

   2
   1

   12

   21

   12

   1
   2

これを修正する方法があるかどうか、またはそれがまったく重要かどうかはわかりません。気づいたものだけです。

0
I506dk

試してみてください

from threading import Thread

def fun1():
    print("Working1")
def fun2():
    print("Working2")

t1 = Thread(target=fun1)
t2 = Thread(target=fun2)

t1.start()
t2.start()
0
Shanan Ilen