2017-01-01 8 views
1

私はワーキングプール内の生成されたプロセスの実行を新しいシステム端末に結合しようとしています。次の例(@ sylvain-lerouxの回答からthis質問に適合)では、キューに入れられたオブジェクトを使って作業を行うワーカーのプールが構築されています。マルチプロセッサで各ワーカーを起動するにはどうすればいいですか?新しいシェルの中の?

import os 
import time 
import multiprocessing 

# A main function, to be run by our workers. 
def worker_main(queue): 
    print('The worker at', os.getpid(), 'is initialized.') 
    while True: 

     # Block until something is in the queue. 
     item = queue.get(True) 
     print(item) 
     time.sleep(0.5) 

if __name__ == '__main__': 

    # Instantiate a Queue for communication. 
    the_queue = multiprocessing.Queue() 

    # Build a Pool of workers, each running worker_main. 
    the_pool = multiprocessing.Pool(3, worker_main, (the_queue,)) 

    # Iterate, sending data via the Queue. 
    for i in range(5): 
     the_queue.put("That's a nice string you got there.") 
     the_queue.put("It'd be a shame if something were to... garble it.") 

    worker_pool.close() 
    worker_pool.join() 
    time.sleep(10) 

あなたがシステム端末からこれを実行した場合、労働者のそれぞれが、同じコンソールをに書き出し、およびで実行されているので、あなたが、文字化けしたテキストの束が表示されます。私が取り組んでいるプロジェクトでは、新しいシェル/コンソールを起動して各ワーカープロセスをホストすると便利です。すべての出力がそのシェルに表示され、ワー​​カープロセスの実行はそのシェルでホストされます。私はshellキーワードを使ってPopenを使っていくつかの例を見てきましたが、互換性の制約のためにプールベースの実装に固執する必要があります。そこに誰かがこれをしましたか?ガイダンスは高く評価されます。

+0

Linuxでは、分離したファイルに書き込んで、手動でシェル 'watch -n 1 cat file.txt'を使ってファイルの新しい内容を1秒ごとに表示することができます。 – furas

+0

ありがとう@furas。それは知っておくと便利なイディオムです。私は通常Linuxで作業しますが、私はこのソリューションをクロスプラットフォームで拡張性のあるものにしたいと考えています。また、これにより私は印刷された情報にアクセスすることができますが、アプリケーションが実行するのに望ましい実行シェルに結びついてしまうことはありません。 –

答えて

1

他の方法でQueueを試してみてください。

Queueの作業員と親プロセスのgetの作業者にのメッセージをQueueから送信して印刷させます。それは混在した出力を取り除くはずです。

親から従業員、および従業員の両方にメッセージを渡したい場合は、2つのキューを使用します。 1つはメッセージをワーカーに渡し、もう1つはメッセージを親に返すためのものです。

+0

それは私が考慮しなかったQueueの面白い使い方です。おそらく便利になるでしょう。残念ながら、この場合は実行されません。私はまだ、親プロセスだけがそのキューを介して作業者に情報を渡す必要があります。これは、有用な作業を行うためです。この例では、すべての作業者が印刷しますが、実際には情報で何か作業を行います。私はプールがインスタンス化された端末から生成されたワーカープロセスを切り離そうとしています。文字化けした文章はカップリングの症状ですが、全体的な問題ではありません。私はより明確になるように質問を修正しました。ありがとう! –

+0

@JustinFletcher次に、2つの 'Queue'を使用します。更新された回答をご覧ください。 –

関連する問題