2016-07-17 21 views
0

最近、私はPythonでマルチプロセッシングを始めました。このコード:Process、JoinableQueueプロセスの安全性

#!/usr/bin/env python 
from Queue import Empty 
from multiprocessing import Process, JoinableQueue 

def _print(): 
    while True: 
     try: 
      p = q.get(True, 3) 
     except Empty: 
      return 
     else: 
      print "Got: " + p 
      q.task_done() 
    return 

def _generate(): 
    pw = bytearray(1); 
    for pw[0] in range(ord('a'), ord('z') + 1): 
     q.put(pw) 
     print "Put: " + pw 

if __name__ == '__main__': 
    q = JoinableQueue() 

    t = Process(target=_generate) 
    t.start() 

    t = Process(target=_print) 
    t.start() 

    q.join() 

が私にこの出力を与える:

Put: a 
... # Correct order a-z and no duplicates 
Put: z 
Got: a 
Got: b 
Got: d 
Got: d 
... # Missing characters and duplicates 
Got: z 

ここで私は上記のコードでは、プロセスの安全性の問題がどこにあるかを把握するために管理することができませんでしたSO上のドキュメントや他のスレッドによると、 。

私は何かが些細なことを見逃していると感じています。誰でも問題を見つけることができますか?これを安全にする方法はありますか?つまり、出力はすべての文字を正しく配置し、一度だけ取得しますか?

私はWindowsでPython 2.7を使用しています。

答えて

0

itertoolsを使用して問題を解決しました。 この問題は、明らかに、Pythonがbytearrayを処理しているために発生しているようです。

関連する問題