我創建了一些多處理代碼 - 檢測問題非常簡單,並且發現了一些問題 - 隊列沒有與同步一起更新。爲什麼隊列不是多進程安全的?
# coding=utf-8
import multiprocessing
def do_work(input_queue, output_queue):
print multiprocessing.current_process().name
input_queue.put(1)
while not input_queue.empty():
output_queue.put(input_queue.get() + 1)
def main():
input_queue = multiprocessing.Queue()
output_queue = multiprocessing.Queue()
for i in range(8):
input_queue.put(i)
processes = []
for i in range(2):
process = multiprocessing.Process(name = str(i),
target = do_work,
args = (input_queue,
output_queue),)
processes.append(process)
process.start()
for process in processes:
process.join()
results = []
while not output_queue.empty():
results.append(output_queue.get())
print len(results), results
if __name__ == '__main__':
main()
有時候結果是 - 什麼好看:
process 0
process 1
10 [2, 1, 3, 4, 6, 5, 8, 7, 2, 2]
但有時結果就像值1不同的過程開始時沒有把:
process 0
process 1
9 [1, 2, 3, 4, 5, 6, 7, 8, 2]
它看起來是不是問題與打印,因爲它是在主線程完成,但隊列不支持進程間鎖定。你能提出一些建議嗎?
這不會使數據結構變得不安全;它是異步行爲,這是我完全希望發生的事情。 – Makoto 2015-02-23 23:55:17
Makoto 10值= 10結果未知的順序,但不是9結果 - 再次看到我簡化了演示文稿。 – Chameleon 2015-02-24 00:02:01
你從哪裏得到10? – Makoto 2015-02-24 00:03:53