如何实现python多处理的非阻塞管理器



我正在尝试为多个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,所以我不知道调用它们selfs以获取expension\items是否会阻塞整个管理器。

相关内容

  • 没有找到相关文章

最新更新