簡體   English   中英

如何為python多處理實現非阻塞管理器

[英]How to implement non blocking manager for python multiprocessing

我正在嘗試為多個 python 進程設置一個管理器。 我的設置是當前一個server進程,N worker_processes和1個expensive_item_getter過程。 我希望工作進程從經理那里請求可能需要一些時間才能獲取的資源,而不會阻塞經理。 許多工作進程將請求相同的資源,因此這些資源被緩存在管理器中,但可能會在第一個請求被處理並緩存結果之前請求相同的資源。 我確信這之前已經完成並且有一個解決方案,但它目前正在逃避我。

  • 理想情況下與 python 3.4+ 的代碼兼容,但不是必需的。

  • 管理器不應阻塞昂貴的調用,而應最終將請求的資源返回給正確的進程以及自操作開始以來請求相同資源的任何其他進程。

  • 必須有一種方法可以做到這一點,而無需手動創建和管理大量帶有回調的隊列和列表。

  • 編輯我會考慮其他庫,但必須跨平台兼容

我試圖在下面概述我的意圖。


import multiprocessing

def worker_process(manager):#runs in own process
    item = manager.get_expensive_item("item_name") # this part can be, and currently is be blocking in this process
    
    
def expensive_item_getter(item_name): # also runs in own process or thread
    #lots of expensive disk io and GPU time
    return item

class MyManager(multiprocessing.managers.BaseManager):
    
    def __init__(self):
        ##register methods
        pass
    
    def get_expensive_item(self, item_name):
        if item_is_cached:
            return cached_item
        else:
            item = expensive_item_getter(item_name)  #this part shouldnt block the server process
            cache_item(item)
            return item

你有沒有嘗試過 ? python中的進程間同步

我使用了一個鎖列表

  if not item_name in self.locks:
    self.locks[item_name ] = Lock()


  with self.locks[item_name]:
    if item_name in cache:
      return cached_item
    else:
      item = expensive_item_getter(item_name)  #this part shouldnt block the server process
      cache_item(item)
      return item

我從未與 BaseManager 合作過,所以我不知道對 get_expensive_items 的調用是否阻塞了整個管理器。

暫無
暫無

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

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