第二个队列没有定义[python]

时间:2016-08-12 13:59:37

标签: python multiprocessing

我在一个脚本中运行了3个进程。进程1将数据传递给进程2,然后进程2将数据传递给进程3.当我将数据放入queue2时,发生错误"全局名称" queue2"没有定义",我现在坚持这个错误......

if __name__ == '__main__':

queue1 = mp.Queue()
queue2 = mp.Queue()

p1 = mp.Process(target=f2, args=(queue1,))
p1.start()

p2 = mp.Process(target=f3, args=(queue2,))
p2.start()

f1()

def f1():
    # do something to a get x
    queue1.put(x)
def f2(q):
    a = q.get()
    # do something to a, to produce b
    queue2.put(b) # error happens here: Global name "queue2" is not defined
def f3(q):
    c = q.get()
    # keeping processing c...

3 个答案:

答案 0 :(得分:1)

当您将queue1传递给f2时,您还需要传递queue2

答案 1 :(得分:0)

您可以将队列声明为全局:

def f2(q):
    global queue2
    a = q.get()
    queue2.put(b)

答案 2 :(得分:0)

这有效:

import multiprocessing as mp

queue1 = mp.Queue()
queue2 = mp.Queue()


def f1(q):
    x = 5
    # do something to a get x
    q.put(x)

def f2(in_queue, out_queue):
    a = in_queue.get()
    b = a + 2
    # do something to a, to produce b
    out_queue.put(b) 

def f3(q):
    c = q.get()
    print c

f1(queue1)

p1 = mp.Process(target=f2, args=(queue1, queue2))
p1.start()

p2 = mp.Process(target=f3, args=(queue2,))
p2.start()

您的代码不会返回您似乎有的错误,它会返回“f2 not defined”,因为当您生成进程p1时,f2还不是已定义的变量。 fork时的规则是,在创建时,您的进程必须看到它们使用的变量,即它们必须在当前范围内。

要清楚地说明,在产生处理时,您从父进程继承当前命名空间。