【问题标题】:Multiprocessing in Python IssuePython问题中的多处理
【发布时间】:2022-01-24 08:37:24
【问题描述】:

我正在 python 中尝试多处理,但似乎无法让它工作。

输入文件如下:

代码如下:

import pandas as pd
import multiprocessing
import time
import datetime


start_time = datetime.datetime.now()
df_main = []
df_main = pd.read_csv("data.csv")
df_file = []

def growth_calculator(Type):
    values = [Type]
    global df_temp, df_file
    df_temp = df_main[df_main.Type.isin(values)]
    df_temp = df_temp[['Company', 'Type']]
    print(df_temp)
    time.sleep(10)

if __name__ == '__main__':
    multiprocessing.Process(target=growth_calculator('Quarterly'))
    multiprocessing.Process(target=growth_calculator('Annual'))
    multiprocessing.Process(target=growth_calculator('Monthly'))
    end_time = datetime.datetime.now()

print("Time Taken -", end_time-start_time)

输出应该需要大约 10-11 秒,但需要 30 秒。所以,很明显,多处理是行不通的。

能否请您指出正确的方向?

提前致谢!

【问题讨论】:

  • 并行性开销压倒任何好处的情况并不少见。如果您真的想弄清楚时间花在哪里,您可能需要添加更多调试细节(包括代表性示例数据)。
  • 您在哪个平台(Linux?Windows?其他?)下运行?当您有多处理问题时,您应该始终使用平台标记您的问题。

标签: python pandas multiprocessing


【解决方案1】:

您需要将目标参数作为 args= 关键字传递给 Process init(请参阅 https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process)。否则,您的函数会在实例化进程之前进行评估,这会导致单进程性能。

类似这样的:

import pandas as pd
import multiprocessing
import time
import datetime


start_time = datetime.datetime.now()


def growth_calculator(Type):

    print(Type)
    time.sleep(10)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=growth_calculator,args=('Quarterly',))
    p2 = multiprocessing.Process(target=growth_calculator,args=('Annual',))
    p3 = multiprocessing.Process(target=growth_calculator,args=('Monthly',))
   
    p1.start()
    p2.start()
    p3.start()
    print('started')
    p1.join()
    p2.join()
    p3.join()
    end_time = datetime.datetime.now()

    print("Time Taken -", end_time-start_time)

【讨论】:

  • 这是完美的,就像一个魅力。太感谢了!不过,我有一个后续问题。我在所有提到的代码行下面添加了一个打印语句,不缩进。它打印三次,即使它不是任何循环的一部分。知道为什么会这样吗?
  • 这是因为当多处理创建进程时,它们也会运行整个程序,以使您的代码可访问。他们修改了__name__,所以只有父进程会执行__name__=='__main__'的部分。它可以防止您的应用程序的“分叉炸弹”。如果您不缩进打印,它将由程序的所有副本执行(实际上应该是 4 次)。参见stackoverflow.com/questions/14175348/…线程中的讨论。
  • 知道了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2020-01-23
  • 2019-02-07
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多