Ray
Ray

Reputation: 13

Second queue is not defined [python]

I have a 3 processes running in one script. Process 1 passes data to Process 2, and then Process 2 passes data to Process 3. When I put data to queue2, error occurs that "Global name "queue2" is not defined", I am stuck on this error now...

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...

Upvotes: 0

Views: 588

Answers (3)

DenverCoder9
DenverCoder9

Reputation: 151

This works :

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()

Your code doesn't return the error you seem to have, it returns "f2 not defined" since you when you spawn the process p1, f2 is not a defined variable yet. The rule when you fork is that at creation time your processes must see the variables they use, i.e. they must be in the current scope.

To put it clearly, at spawning process time you inherit the current namespace from the parent process.

Upvotes: 0

Will Molter
Will Molter

Reputation: 530

You can declare the queues as global:

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

Upvotes: 0

Scott Hunter
Scott Hunter

Reputation: 49920

Just as you passed queue1 to f2, you also need to pass queue2.

Upvotes: 1

Related Questions