流程,JoinableQueue流程安全

时间:2016-07-17 21:20:09

标签: windows python-2.7 process queue multiprocessing

最近我在Python中进行了多处理。这段代码:

#!/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。

1 个答案:

答案 0 :(得分:0)

使用itertools生成字符解决了问题。 这个问题显然是由python对bytearray的处理造成的。