2016-05-17 12 views
0

次のコードのエラーは、しばらく続きます。私が1つのプロセスを開始するとうまく動作します。しかし、私はプロセスの数を11に増やし続け、エラーを投げつけ始めます。PythonマルチプロセッシングTypeError: 'int'オブジェクトは反復可能ではありません

try: 
    num_workers = int(sys.argv[1]) 
except: 
    num_workers = 1 

someval = 10 
def do_work(in_queue,x): 
    i = 0 
    while True: 
     item = in_queue.get() 
     line_no, line = item 

     # exit signal 
     if line == None: 
      if i > 0 : 
       work.put(i,) 
      # work.put(i) 
      return 
     else: 
      print "value from work " + line.rstrip('\n') 
      i = i + 1 

if __name__ == "__main__": 

    manager = Manager() 
    work = manager.Queue(num_workers) 
    someval = 20 
    print " Number of workers is " + str(num_workers) 
    pool = [] 
    for i in xrange(num_workers): 
     p = Process(target=do_work, args=(work,someval)) 
     p.start() 
     pool.append(p) 
    with open("/home/jay/scripts/a.txt") as f: 
     iters = itertools.chain(f, (None,)*num_workers) 
     for num_and_line in enumerate(iters): 
       work.put(num_and_line) 

    x = 0 
    for p in pool: 
     p.join() 

ファイル/home/jay/scripts/a.txtには10行があります。

私が行う場合

./x.py 7 
    Number of workers is 7 
    value from work 1 
    value from work 2 
    value from work 3 
    value from work 4 
    value from work 5 
    value from work 6 
    value from work 7 
    value from work 8 
    value from work 9 
    value from work 10 
    x is 0 
    all done 

./x.py 11 
Number of workers is 11 
value from work 1 
value from work 2 
value from work 3 
value from work 4 
value from work 5 
value from work 6 
value from work 7 
value from work 8 
value from work 9 
value from work 10 
Process Process-11: 
Traceback (most recent call last): 
    File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "./x.py", line 18, in do_work 
    line_no, line = item 
TypeError: 'int' object is not iterable 
x is 0 
all done 
+0

18行目の前に 'print(repr(item))'を追加して、値が –

答えて

2

問題のある行は、あなたがキューに入れintdo_workwork.put(i,)であり、そのintを読んで、他の作業者が解凍されます。

また、私はマルチプロセシングを使用していることに同意します。プールは簡単で短くなります。

if __name__ == "__main__": 
    pool = multiprocessing.Pool(num_workers) 
    with open("/home/jay/scripts/a.txt") as f: 
     mapped = pool.map(do_work, f) 

あなたは労働者からiはちょうどそれを返すと、それは問題ではwork.put(1,)あなたはそれがないと思う何をしないということであるmapped

+0

であることを知ることができます。私の実際のファイルは100GB以上です。別のスレッドごとに、「地図はあなたのファイルをすべて一度に消費してから作業を開始します。」そこで、私はこのアプローチをとることにしました。 http://stackoverflow.com/questions/11196367/processing-single-file-from-multiple-processes-in-python – Jayadevan

2

に格納されることが必要な場合。 1タプル(1,)をキューに入れようとしていますが、実際には1をキューに入れるだけです。その行をwork.put((1,))に変更すると、予想される動作が表示されます。

あなたのサブプロセスの一つは、メインプロセスでループのためにあなたの前にキューに1を追加することができますnum_workersの値が大きいとの競合状態は(None,)番兵とQueueをアップロードござい終了です。 num_workersの値を小さくすると、ワーカープロセスのいずれかが1をキューに追加する前にforループが発生します。また

は、あなたではなく、手動でProcessQueueを使用してPoolを作成し、multiprocessing.Poolを使用して検討していますか?あなたのコードをかなり単純化するでしょう。

関連する問題