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