【问题标题】:Python multiprocessing queue get and putPython多处理队列获取和放置
【发布时间】:2017-04-08 01:22:43
【问题描述】:

我正在尝试使用 python 多处理来用字符串填充队列,然后将它们打印出来,但遇到了麻烦。有人能指出我做错了什么吗?

import multiprocessing

my_q = multiprocessing.Queue()
my_list  =[i for i in range(0,100)]

def enqueue(q):
    for data in my_list:
        q.put(data)

def get_it(q):
    while not q.empty():
        item = q.get()
        print(item)


p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
p2 = multiprocessing.Process(target=get_it, args=(my_q,))
p1.start()
p2.start()

p1.join()
p2.join()

此程序执行时不打印任何内容。

【问题讨论】:

    标签: python queue multiprocessing


    【解决方案1】:

    如果在填充队列之前执行get_it,它将立即返回,不打印任何内容。

    您需要确保在调用 get_it 之前填充队列。

    例如,等到enqueue 被调用,直到所有项目都入队:

    ...
    
    p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
    p1.start()
    p1.join()
    
    p2 = multiprocessing.Process(target=get_it, args=(my_q,))
    p2.start()
    p2.join()
    

    或者像下面这样修改get_it不要过早结束:

    ...
    
    def get_it(q):
        while True:
            item = q.get()
            if item is None:  # loop until sentinel value (None) appear.
                break
            print(item)
    
    
    my_list.append(None)  # sentinel value to denote end of input value
    p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
    p2 = multiprocessing.Process(target=get_it, args=(my_q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    

    或改用multiprocess.pool.Pool.map

    import multiprocessing.pool
    
    def get_it(item):
        print(item)
    
    pool = multiprocessing.pool.Pool()
    pool.map(get_it, range(100))
    

    【讨论】:

    • 啊,明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2012-07-11
    相关资源
    最近更新 更多