使用multiprocessing.Pool,Python的collection.deque似乎不是线程安全的

时间:2016-12-13 16:51:01

标签: python python-2.7 thread-safety python-multiprocessing deque

我正在处理一小段代码,其目的是:

  • 要运行任意数量的进程(例如10个)。
  • 因为我有两个主题,所以我想一次运行两个主题。
  • 我希望他们从队列中读取值。队列只包含两个不同的值,我希望两个进程同时运行以读取这些不同的值。

例如,考虑下一个示例代码:

import collections
import time

q = collections.deque()
q.append(0)
q.append(1)

def f(i):
    d = q.popleft()
    print d
    time.sleep(1)
    q.append(d)

from multiprocessing import Pool
t = Pool(2)
t.map(f, range(10))

运行时,我希望第一对进程分别读取0和1。我真的不介意它们的打印顺序(0,1或1,0)。但是,输出如下:

0
0
1
1
0
0
1
1
0
1

如果deque是线程安全的,为什么会发生这种情况?此外,前8个值每1秒一次打印2个,但对于最后2个值,它们之间也有1秒的暂停。为了澄清这一点,让我用连字符画1秒暂停:

0
0
-
1
1
-
0
0
-
1
1
-
0
-
1

为什么会这样?

非常感谢。

1 个答案:

答案 0 :(得分:0)

进程不共享内存。

在您的示例中,每个进程都在其自己的双端队列副本上工作。它们之间根本没有同步。

您可以使用multiprocessing.Queue对象来获得正确的结果。