微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

下游库类方法中的多处理

如何解决下游库类方法中的多处理

我正在使用一个 python 类(我们称之为 class1),它安装了另一个库(我们称之为 library2)作为依赖项。 library2 有一个实例化的特定类,我们将其称为 class2。在 class2 的构造函数中,其他类被实例化。

class2 中有一个方法(我们称之为 method2),它包含一个循环,该循环会触发同一类中的另一个方法,进而触发在构造函数中实例化的类对象的方法。我不确定这些细节是否重要,但我想我会注意它们。以下是对这种情况的可视化尝试:

class1 -> 
  class2 -> (library dependency of class 1)
     method2 -> (multiprocessing needed here)
       external class methods

我想在 method2 的循环中实现多处理,如果我直接执行模块,我可以通过各种方式成功实现。

但是,如果类/模块是从上游进程触发的,我就会遇到可怕的 TypeError: can't pickle _hashlib.HASH objects。为了解决这个问题,我尝试了各种变通方法,其中一些包括

  1. 在 class2 中实现顶级包装器方法,我在其中实例化 class2,类似于给出的解决方here
  2. 在 class2 中实现一个顶级方法,将 class2 方法转换为 base64 并尝试映射转换后的函数,类似于答案 here

如前所述,如果我直接运行该类,这些不会显示错误,而是当该类由上游模块作为依赖项触发时。

我能够通过在 class2 的顶级方法中使用 pathos multiprocessing 并从 class2 的 method2 中调用它来解决错误,如下面的代码(受答案 here 启发),但这导致性能比没有多处理的原始代码差。

import pathos.multiprocessing as mp

class Class2:
    ...
    def method2(list1,list2):
        for i in range(0 to n):
            results = run_func_pathos(list1,list2)

def run_func_pathos(param_list1,param_list2):
    
    class2 = Class2()
    pool = mp.ProcessingPool(os.cpu_count())
    results = pool.map(class2.method2,param_list1,param_list2)

    return results

如何在下游类中利用多处理?这甚至可能吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。