2つの機能を同時に実行しようとしています。
def func1():
print 'Working'
def func2():
print 'Working'
func1()
func2()
誰もこれを行う方法を知っていますか?
これを行う:
from threading import Thread
def func1():
print 'Working'
def func2():
print 'Working'
if __== '__main__':
Thread(target = func1).start()
Thread(target = func2).start()
スレッド化についての答え は良いですが、やりたいことについてもう少し具体的にする必要があります。
両方とも多くのCPUを使用する2つの関数がある場合、スレッド化(CPythonで)はおそらくどこにも行かないでしょう。次に、 multiprocessing module をご覧になるか、jython/IronPythonを使用することをお勧めします。
CPUにバインドされたパフォーマンスが理由である場合は、(スレッド化されていない)Cで実装することもでき、Pythonで2つの並列処理を行うよりもはるかに高速化できます。
より多くの情報がなければ、良い答えを見つけるのは簡単ではありません。
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バウンドタスクを同時に実行したい。
これは、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のその他の利点については、 この関連記事 を参照してください。
あなたが伝えようとしていることは、マルチプロセッシングによって達成できると思います。ただし、スレッドを介して実行する場合は、これを実行できます。これは役立つかもしれません
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()
スレッドモジュールはマルチプロセスとは異なり同時に動作しますが、タイミングは少しずれています。以下のコードは、「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
これを修正する方法があるかどうか、またはそれがまったく重要かどうかはわかりません。気づいたものだけです。
試してみてください
from threading import Thread
def fun1():
print("Working1")
def fun2():
print("Working2")
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t1.start()
t2.start()