线程安全队列

时间:2016-03-21 05:31:27

标签: python multithreading

我正在python 2.7中使用带有concurrent.futures库的Queue。当我在下面运行此代码片段时,它打印四个1并不罕见。我希望线程队列是一种共享数据的方式,但它似乎不是线程安全的。如何使其线程安全?

q = Queue.Queue()

def test():
    x = q.get(True)
    print x

def thread_pool():
    for x in [1,2,3,4,5]:
        q.put(x)
    #with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
    executor = concurrent.futures.ProcessPoolExecutor(max_workers=5)
    for x in range(5):
        executor.submit(test)

1 个答案:

答案 0 :(得分:5)

那不是线程池。它是一个进程池。如果要在进程之间共享对象,则需要使用the number of master nodes代替(并可能将整个程序切换为使用multiprocessing.Queue;文档目前尚不清楚)。如果您想使用线程而不是进程,则需要使用concurrent.futures.ThreadPoolExecutor而不是ProcessPoolExecutor