I am trying to run two functions simultaneously, and return from them their outputs. I have written the following code, but it only works to retrieve the output from either q1 or q2 once, but when I try a second time, I get stuck on an infinite loop. I do not understand why.
from threading import Thread
from multiprocessing import Queue
import multiprocessing
import time
def functionA(A, B):
dictA=[]
for i in list(range(A, B)):
print(i, "from A")
time.sleep(1)
for p in list(range(0, 10)):
dictA.append({i:p})
return(dictA)
def functionB(C, D):
dictB=[]
for i in list(range(C, D)):
print(i, "from B")
time.sleep(1)
for p in list(range(0, 10)):
dictB.append({i:p})
return(dictB)
#Create variables from global variables
def wrapper(func, args, queue):
queue.put(func(*args))
q1, q2 = multiprocessing.Manager().Queue(), multiprocessing.Manager().Queue()
Thread(target=wrapper, args=(functionA, [0, 10], q1)).start()
Thread(target=wrapper, args=(functionB, [10, 20], q2)).start()
First time I try to get q1:
print(q1.get()) (0.9s)
[{0: 0}, {0: 1}, {0: 2}, {0: 3}, {0: 4}, {0: 5}, {0: 6}, {0: 7}, {0: 8}, {0: 9}, {1: 0}, {1: 1}, {1: 2}, {1: 3}, {1: 4}, {1: 5}, {1: 6}, {1: 7}, {1: 8}, {1: 9}, {2: 0}, {2: 1}, {2: 2}, {2: 3}, {2: 4}, {2: 5}, {2: 6}, {2: 7}, {2: 8}, {2: 9}, {3: 0}, {3: 1}, {3: 2}, {3: 3}, {3: 4}, {3: 5}, {3: 6}, {3: 7}, {3: 8}, {3: 9}, {4: 0}, {4: 1}, {4: 2}, {4: 3}, {4: 4}, {4: 5}, {4: 6}, {4: 7}, {4: 8}, {4: 9}, {5: 0}, {5: 1}, {5: 2}, {5: 3}, {5: 4}, {5: 5}, {5: 6}, {5: 7}, {5: 8}, {5: 9}, {6: 0}, {6: 1}, {6: 2}, {6: 3}, {6: 4}, {6: 5}, {6: 6}, {6: 7}, {6: 8}, {6: 9}, {7: 0}, {7: 1}, {7: 2}, {7: 3}, {7: 4}, {7: 5}, {7: 6}, {7: 7}, {7: 8}, {7: 9}, {8: 0}, {8: 1}, {8: 2}, {8: 3}, {8: 4}, {8: 5}, {8: 6}, {8: 7}, {8: 8}, {8: 9}, {9: 0}, {9: 1}, {9: 2}, {9: 3}, {9: 4}, {9: 5}, {9: 6}, {9: 7}, {9: 8}, {9: 9}]
Second time I try to get q1 its stuck on infinite loop:
print(q1.get())
.......
CodePudding user response:
You created 2 queues q1
and q2
, and according to what you said you only do q1.get()
and you try to do is twice while what you need to do is:
print(q1.get())
print(q2.get())
Or you can use 1 queue and then you can do q1.get()
twice.