Python 在池进程之间共享队列对象

Python 在池进程之间共享队列对象,python,multiprocessing,pathos,Python,Multiprocessing,Pathos,我使用pathosProcessingPool类来计划跨多个内核并发执行run\u regex()函数。该函数将正则表达式作为参数,并计算列表项是否匹配。如果找到匹配项,它会将匹配值放入结果\u队列 据我所知,当前每个工作进程在其虚拟地址空间中创建一个result\u queue的本地副本。但是,我想使用这个队列对象作为共享内存机制,以便从主进程访问所有匹配项 问题: 是否有方法将队列对象传递到池初始值设定项中,以便队列充当共享内存部分 是否需要与队列对象同步 有没有更好的方法来解决这个问题 代

我使用
pathos
ProcessingPool
类来计划跨多个内核并发执行
run\u regex()
函数。该函数将正则表达式作为参数,并计算列表项是否匹配。如果找到匹配项,它会将匹配值放入
结果\u队列

据我所知,当前每个工作进程在其虚拟地址空间中创建一个
result\u queue
的本地副本。但是,我想使用这个队列对象作为共享内存机制,以便从主进程访问所有匹配项

问题:

  • 是否有方法将队列对象传递到池初始值设定项中,以便队列充当共享内存部分
  • 是否需要与队列对象同步
  • 有没有更好的方法来解决这个问题
  • 代码片段

    from multiprocessing import Lock, Queue
    from pathos.multiprocessing import ProcessingPool
    
    result_queue = Queue()
    lock = Lock()
    data = {}
    
    def run_regex(self, expr):
    
    for key, value in data.iteritems():
        matchStr = re.search(expr, key, re.I)
        if matchStr:
            lock.acquire()
            result_queue.put(key)
            lock.release()
            break
    
    def check_path(self):
    
        pool = ProcessingPool()
        pool.map(run_regex, in_regex)
    
  • 是的,您可以查看
    对象的参数
  • Queue
    对象已经是mp安全的,因此无需保护它们
  • run\u regex
    函数返回值不需要
    队列。您只需从函数返回
    ,即可通过
    映射
    结果使用该键

    def run_regex(expr):
        group = []
    
        for key, value in data.iteritems():
            match = re.search(expr, key, re.I)
            if match is not None:
                group.append(key)
    
        return group
    
    groups = pool.map(run_regex, in_regex)
    keys = [key for group in groups for key in group]
    

    map
    将返回按
    run\u regex
    分组的键。之后,您可以轻松地将列表展平

  • keys = list(itertools.chain.from_iterable(groups))