[英]Python Multiprocessing queue.get() timeout when queue is not empty
我正在嘗試實現一個從第二個進程 function 填充的多處理隊列。 測試這個 function,看起來多進程工作正常,隊列似乎正在填充。 我已經通過打印數據確認了工人 function 中的數據是正確的。 此外,我已經確認 qsize 在運行queue.put(ret)
后會增加。 但是,運行queue.get()
會導致代碼掛起和超時。 這似乎與我放入隊列中的數據有關,因為我的工作人員 function 中的簡單queue.put("hello")
工作正常。 任何想法為什么會發生這種情況? 我在下面附上了相關代碼。
def worker(queue):
print("Running worker")
ret = odrive.find_any()
queue.put(ret)
#print(ret)
def findODrives():
M = []
foundAll = False
queue = Queue()
print("Starting findODrives")
while foundAll == False:
doneFinding = False
while doneFinding == False:
print("Finding ODrive")
p = multiprocessing.Process(target=worker, name="ODriveFind", args=(queue,))
p.start()
p.join(10)
if p.is_alive():
print("worker is running... let's kill it...")
# Terminate worker
p.terminate()
p.join()
doneFinding = True
elif(queue.qsize() != 0):
print("Queue is not zero")
print((queue.qsize()))
try:
obj = queue.get(timeout=10)
except:
print("Failed to get data in queue")
print(obj)
M.append(obj)
print("test")
print("Found ODrive with serial number: " + str(M[-1].serial_number))
def main():
while(True):
inp = input("Please press enter to continue with an operation, or QUIT to exit...")
if inp == "QUIT":
exit()
MList = findODrives()
if __name__ == "__main__":
main()
編輯:忘記包含導入語句。 我正在使用多處理隊列,如圖:
import odrive
from odrive.enums import *
from odrive.utils import *
import multiprocessing
from multiprocessing import Queue
將此用於隊列
import multiprocessing
manager = multiprocessing.Manager()
queue = manager.Queue()
這並沒有直接回答問題,而是演示了如何使用隊列進行子進程之間的通信。 在這種情況下,一種客戶端/服務器策略。
真正重要的是,您必須有某種方式告訴服務器它不會再接收任何數據,以便它可以優雅地終止。 所以,我們在這里所做的是將一些整數發送到隊列中。 完成后,我們發送無。 服務器接收到的任何不是 None 的東西都會被打印出來。 如果收到 None 則終止。
希望這將幫助您建立良好的實踐:
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Manager
def server(q):
while (v := q.get()) is not None:
print(v)
def client(q):
for i in range(10):
q.put(i)
q.put(None)
def process():
with Manager() as manager:
q = manager.Queue()
with ProcessPoolExecutor() as executor:
wait(executor.submit(func, q) for func in (server, client))
if __name__ == '__main__':
process()
Output:
0
1
2
3
4
5
6
7
8
9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.