2017-07-16 13 views
1

私は私のスクリプトマルチスレッドを作成しようと、スレッドを使用したマルチプロセッシング?

私は、マルチプロセッシングを発見しました

私はスレッドとマルチプロセッシングの仕事を作るための方法がありますかしら?

  • CPU 1 - > 3つのスレッド(作業者A、B、C)
  • CPU 2 - > 3つのスレッド(ワーカーD、E、F)
  • ...

イム私自身はそれをやろうとしていましたが、私は非常に多くの問題にぶつかりまし

これらの2つの機能を連携させる方法はありますか?

答えて

2

それらの内側からThreads。各プロセスは、標準のインタプリタスレッドが処理できるほとんどのものを処理できます。したがって、新しいスレッドや各プロセス内の新しいプロセスを作成することを止めるものはありません。最小の例として:スレッド間

def foo(): 
    print("Thread Executing!") 

def bar(): 
    threads = [] 
    for _ in range(3): # each Process creates a number of new Threads 
     thread = threading.Thread(target=foo) 
     threads.append(thread) 
    for thread in threads: 
     thread.start() 
     thread.join() 

if __name__ == "__main__": 
    processes = [] 
    for _ in range(3): 
     p = multiprocessing.Process(target=bar) # create a new Process 
     processes.append(p) 
    for process in processes: 
     process.start() 
     process.join() 

コミュニケーション各Process内で処理することができ、プロセス間の通信は、キューまたはマネージャ・オブジェクトを使用してルート・インタプリタレベルで処理することができます。

+0

このコードは本当に助けになりました! このコードにキューを追加すると、処理またはスレッドをロックする必要がありますか? 私はプロセスをロックすると仮定私は3スレッドを停止しますか? –

+0

@ atth3burger91それはあなたがしようとしていることによって異なります。 [documentation](https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes)によると、「キューはスレッドとプロセスが安全です」ということはないので、同時にキューに追加する心配はありません。ただし、特定の順序で追加および取得する場合は、ロックを追加するか、キューに渡すオブジェクトに識別子を追加する必要があります。マネージャのdictsは軽量ではありませんが、使いやすくすることもできます。 – JAustin

+0

printはスレッドセーフではないので、私の元の例はお粗末です。それぞれのprint文は、出力ストリームへの同時書込みを防ぐために 'lock.acquire'と' lock.release'文を持つべきです。 – JAustin

1

あなたはprocessを取るfunctionを定義し、例えば、それはこのfunctionをターゲットに、あなたのプロセスを起動後、3 threadsを実行して行うことができます:あなたはProcessesの数、そして卵を生成することができます

def threader(process): 
    for _ in range(3): 
     threading.Thread(target=yourfunc).start() 

def main(): 
    # spawn whatever processes here to target threader 
関連する問題