我在一个脚本中运行了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...
答案 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时的规则是,在创建时,您的进程必须看到它们使用的变量,即它们必须在当前范围内。
要清楚地说明,在产生处理时,您从父进程继承当前命名空间。