簡體   English   中英

Python 隊列不為空時多處理 queue.get() 超時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM