代码之家  ›  专栏  ›  技术社区  ›  GregH

为什么我不能在Python主线程的子进程中看到写入的队列?

  •  1
  • GregH  · 技术社区  · 7 年前

    我有一个使用多重处理的简单程序。它基本上执行数学运算并将结果写入队列。我可以看到多处理函数内部的队列大小在增长,但一旦我在主线程/进程外部,队列就为空。这似乎是某种我不理解的范围界定问题。有人能解释一下为什么队列在函数之外是空的吗?我尝试过将队列作为参数传递给函数,以及其他方法,但它似乎总是空的。

    from multiprocessing import Pool, Process
    import math
    import Queue
    
    q = Queue.Queue(maxsize=0)
    
    
    def compute_and_write(val):
        sq = val * val
        sq = math.sqrt(sq)
        sq = sq + sq + sq
        q.put("Q" + str(sq))
        print "Queue size (inside) = " + str(q.qsize())
        return sq
    
    
    p = Pool(8)
    y = []
    
    for x in range(1, 100):
        y.append(x)
    
    res = p.map(compute_and_write, y)
    print "Queue size (outside) = " + str(q.qsize())
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Peters    7 年前

    A. Queue.Queue 在跨进程行为方面与列表或dict没有什么不同:每个进程都有自己的不同对象,一个进程副本中的更改对任何其他进程的副本都没有任何影响。

    你想要一个 multiprocessing.Queue 相反设计为具有可见状态 穿过 过程。这就是一切。