【问题标题】:Multiprocessing on python 3.10 appending to the same list附加到同一列表的 python 3.10 上的多处理
【发布时间】:2023-01-18 22:13:19
【问题描述】:

我目前正在尝试学习如何在 python 上使用多处理。此外,我想在我的代码上应用多处理。

我已经阅读了有关该主题的其他问题,但这些问题的解决方案在我的环境中不起作用(可能是因为 python 3.10 发生了某些变化)

我的代码看起来像:

def obtenern2():
        A = []
        for d in days:
            aux = dfhabil[dfhabil["day"] == d]
            n2 = casosn(aux,2)
            aml = ExportarMODml(n2)
            adl = ExportarMODdl(n2)
            A.append(aml)
            A.append(adl)
        return pd.concat(A)

B = obtenern2()

其中“ExportarMODml”或“ExportarMODdl”采用数据帧“n2”并执行一些返回数据帧的计算(因此“A”实际上是数据帧列表)。

我认为“ExportarMODml”和“ExportarMODdl”可以并行处理,但我不知道如何将生成的数据帧附加到同一个列表而不会导致损坏或类似情况。

【问题讨论】:

    标签: python parallel-processing multiprocessing


    【解决方案1】:

    这是一种您可能可以适应您的要求的模式。

    我们有两个函数 ExportarMODml 和 ExportarMODdl。每个函数都将字典作为其唯一参数并返回一个 DataFrame。

    这些可以并行执行,因此可以实现返回的 DataFrame 的串联:

    from pandas import concat, DataFrame
    from concurrent.futures import ProcessPoolExecutor
    
    def ExportarMODml(d):
        return DataFrame(d)
    
    def ExportarMODdl(d):
        return DataFrame(d)
    
    def main():
        d = {'a': [1,2], 'b': [3,4]}
    
        with ProcessPoolExecutor() as ppe:
            futures = [ppe.submit(func, d) for func in (ExportarMODml, ExportarMODdl)]
            df = concat([future.result() for future in futures])
            print(df)
    
    if __name__ == '__main__':
        main()
    

    输出:

       a  b
    0  1  3
    1  2  4
    0  1  3
    1  2  4
    

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2016-05-14
      • 2021-02-13
      • 2018-08-19
      • 2013-08-17
      相关资源
      最近更新 更多