簡體   English   中英

python中帶有SyncManager類的多進程優先隊列的隊列函數

[英]queue function for Multiprocess Priority Queue in python with SyncManager class

我想實現多處理 priorityqueue 。 我找到了這個答案:- 在 Python 2.7.6 中使用多處理的奇怪的 Queue.PriorityQueue 行為

達諾

在我實施了這個之后。 我可以將 .get() 和 .put() 函數用於我的優先隊列,但是當我使用 .queue 打印隊列中的當前元素時,它給了我一個錯誤

代碼:-

 class MyManager(SyncManager):   
    pass

def get_manager():
    MyManager.register("PriorityQueue", PriorityQueue)  # Register a shared PriorityQueue
    m = MyManager()
    m.start()
    return m

m = get_manager()
call= m.PriorityQueue()
for i in range(5):
    call.put(i)

print(call.queue)

錯誤: AttributeError: 'AutoProxy[PriorityQueue]' object has no attribute 'queue'

我閱讀了 SyncManager 的 python 文檔並修改了我的代碼。

新代碼:-

class MyManager(SyncManager):   
    pass

def get_manager():
    MyManager.register("PriorityQueue", PriorityQueue,exposed=['put','get','queue'])  # Register a shared PriorityQueue
    m = MyManager()
    m.start()
    return m

m = get_manager()
call= m.PriorityQueue()
for i in range(5):
    call.put(i)

print(call.queue)

現在輸出是:-

<bound method AutoProxy[PriorityQueue].queue of <AutoProxy[PriorityQueue] object, typeid 'PriorityQueue' at 0x7ff3b48f2dd0>>

我仍然沒有獲取隊列中的元素,我閱讀了 register 函數的method_to_typeid屬性以映射exposed提到的函數的返回類型,但我不知道如何使用它。

有人可以幫我解決這個問題嗎,這樣我就可以打印隊列的元素而不用從隊列中彈出它們

您只能通過代理使用引用對象的方法 由於PriorityQueue().queue不是一個方法,而是一個實例屬性,所以需要提供一個可以返回該屬性值的方法。 下面的示例選擇了具有子類PriorityQueue的通用get_attribute方法。

# Python 3.7.1
from queue import PriorityQueue
from multiprocessing.managers import SyncManager
from multiprocessing import Process


SENTINEL = None


class MyPriorityQueue(PriorityQueue):
    def get_attribute(self, name):
        return getattr(self, name)


class MyManager(SyncManager):
    pass


def get_manager():
    MyManager.register("PriorityQueue", MyPriorityQueue)
    m = MyManager()
    m.start()
    return m


def f(q):
    for item in iter(lambda: q.get()[1], SENTINEL):
        print(item)
    print(f'queue: {q.get_attribute("queue")}')


if __name__ == '__main__':

    m = get_manager()
    pq = m.PriorityQueue()

    tasks = enumerate([f'item_{i}' for i in range(5)] + [SENTINEL])

    for task in tasks:
        pq.put(task)

    print(f'queue: {pq.get_attribute("queue")}')
    print(f'maxsize: {pq.get_attribute("maxsize")}')

    p = Process(target=f, args=(pq,))
    p.start()
    p.join()

示例輸出:

queue: [(0, 'item_0'), (1, 'item_1'), (2, 'item_2'), (3, 'item_3'), (4, 'item_4'), (5, None)]
maxsize: 0
item_0
item_1
item_2
item_3
item_4
queue: []

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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