2012-03-21 14 views
1

いくつかのCPUバインドされたタスクで動作するマルチプロセッシングを取得しようとしています。しかし、私は子プロセスで関数を呼び出す方法を理解することができず、帯域外タスクを実行するために何らかの引数を渡す可能性があります。どんな助けもありがとう。関数を呼び出して、多重処理でいくつかの引数を渡す方法

child.py

import multiprocessing 
def Performer(multiprocessing.Process): 

    def __init__(self, taks_queue): 
     super().__init__() 
     self.taks_queue = taks_queue 
     self.term_str = "done" 

    def set_term_str(self, term_str): 
     self.term_str = term_str 

    def run(self): 
     while True: 
      task = taks_queue.get() 
      if task == self.term_str: 
       while taks_queue.qsize() > 0: 
        taks_queue.get() 
      else:   
       handle_task(task) 

parent.py

import multiprocessing 
def Generator(multiprocessing.Process): 

    def run(self): 
     taks_queues = [multiprocessing.Queue(-1) for i in range(5)] 
     for i in range(5): 
      perfs.append(Performer(taks_queue = taks_queue[i])) 
      perfs[i].start() 

     while True: 
      message = get_message() 
      mod = check_message(message) 
      if mod != 0: 
       term_str = get_term_str(mod,message) 
       perfs[mod].set_term_str(term_str) 

      handle_task(task) 

if __name__=="__main__": 
    gen = Generator() 
    gen.start() 
    gen.join() 

発電機は、外の世界と通信し、必要なときに長期文字列を変更する必要があります。どのように私は別のマルチプロセッシングの関数を呼び出すことができるだろうか。プロセスとマルチプロセスの実行動作を変更するいくつかの引数を渡す。プロセス?

答えて

0

あなたは2の主要なオプションがあります:親と子の両方に利用可能であること、共有メモリを宣言する

  1. 利用価値を()。 intまたは文字列を共有値として使用できます。 http://docs.python.org/library/multiprocessing.html#shared-ctypes-objects

  2. 子のタスクキューにterm_stringを配置します。子がキューからポップすると、値をチェックする必要があります。

    あなたが欲しいもののためにBTW

、Pythonはまだ共有しようと、私は、パラメータとして、いくつかのpickableオブジェクトを渡すことになるためhttp://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    pool = Pool(processes=4)    # start 4 worker processes 
    result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously 
    print result.get(timeout=1)   # prints "100" unless your computer is *very* slow 
    print pool.map(f, range(10))   # prints "[0, 1, 4,..., 81]" 
+0

おかげで、参照、サブプロセスワーカープールの偉大なメカニズムを提供します記憶が助けにならない。私はメッセージのterm_strベースを変更する必要があり、最初のいくつかのメッセージの後に出演者が異なるterm_strを持つことが予想されるため、プールは適切ではありません。 – SCM

+0

の場合は、キュー経由でterm_strをプッシュする必要があります。あなたのコードでやろうとしたことをすることはできません。 –

関連する問題