最近我在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。
答案 0 :(得分:0)
使用itertools
生成字符解决了问题。
这个问题显然是由python对bytearray
的处理造成的。