10

2 つのはるかに複雑な Python スクリプトを使用し、結果を処理する単純な Python スクリプトがあります。

Foo と Bar の 2 つのモジュールがあり、コードは次のようになります。

import Foo
import Bar

output = []

a = Foo.get_something()
b = Bar.get_something_else()

output.append(a)
output.append(b)

どちらの方法も実行に時間がかかり、どちらも他に依存しないため、明白な解決策はそれらを並行して実行することです。どうすればこれを実現できますが、順序が維持されていることを確認してください:どちらが先に終了しても、スクリプトを続行するには、もう一方が終了するまで待つ必要があります。

説明が不十分な場合はお知らせください。サンプル コードはできる限りシンプルにしています。

4

2 に答える 2

23

一般に、threadingこれを行うために使用します。

まず、並行して実行したいものごとにスレッドを作成します。

import threading

import Foo
import Bar

results = {}

def get_a():
    results['a'] = Foo.get_something()
a_thread = threading.Thread(target=get_a)
a_thread.start()

def get_b():
    results['b'] = Bar.get_something_else()
b_thread = threading.Thread(target=get_b)
b_thread.start()

次に、両方が終了することを要求するには、両方で使用.join()します。

a_thread.join()
b_thread.join()

その時点で結果は と になるresults['a']のでresults['b']、順序付きリストが必要な場合は次のようになります。

output = [results['a'], results['b']]

注: 両方のタスクが本質的に CPU を集中的に使用する場合は、multiprocessing代わりに検討することをお勧めします。Python の GIL により、特定の Python プロセスは 1 つの CPU コアしか使用しませんがmultiprocessing、タスクを別々のコアに分散できます。ただし、 よりオーバーヘッドがわずかに高いためthreading、タスクの CPU 使用率が低い場合は、それほど効率的ではない可能性があります。

于 2012-05-07T00:30:25.377 に答える
10
import multiprocessing

import Foo
import Bar

results = {}

def get_a():
    results['a'] = Foo.get_something()



def get_b():
    results['b'] = Bar.get_something_else()

process_a = multiprocessing.Process(target=get_a)
process_b = multiprocessing.Process(target=get_b)


process_b.start()
process_a.start()


process_a.join
process_b.join

これは、プログラムのプロセス バージョンです。

注:スレッドには共有データ構造があるため、データの誤った操作を回避するロックについて心配する必要があります。さらに、上記の琥珀色のように、GIL(グローバルインタープリターロック)の問題もあり、両方のタスクがCPUを集中的に使用するため、これはつまりスレッドの取得と解放をスレッドに通知する呼び出しのため、より多くの時間がかかることがわかります。ただし、タスクが I/O 集中型の場合、それほど影響はありません。

プロセス内に共有データ構造がないため、LOCKS について心配する必要がなく、GIL に関係なく機能するため、実際にマルチプロセッサの真の力を享受できます。

覚えておくべき簡単な注意: プロセスは、共有データ構造を使用しないだけでスレッドと同じです (すべてが分離して機能し、メッセージングに焦点を当てています)。

dabeaz.comをチェックしてください。彼は一度、並行プログラミングに関する優れたプレゼンテーションを行いました。

于 2014-11-21T19:08:16.813 に答える