python并行执行几个类方法

时间:2017-08-28 11:57:46

标签: python parallel-processing multiprocessing

我创建了几个自定义类来转换数据帧,如下所示(简化版本):

class class1():
      def _init_(self, a):
          self.dataframe = a

      def __getitem__(self, key):
          return self.dataframe[key]

      def transform(self):
          self.dataframe = (some dataframe computations)
          return self.dataframe


class class2():
      def _init_(self, b):
          self.dataframe = b

      def __getitem__(self, key):
          return self.dataframe[key]

      def transform(self, arg0):
          self.dataframe = (some dataframe computations)
          return self.dataframe

我现在要做的是并行执行这两个类方法。 我想它应该是这样的:

import multiprocessing

df1 = class1(a)
pr1 = multiprocessing.Process(target=df1.transform)
df2 = class2(b)
pr1 = multiprocessing.Process(target=df2.transform, kwargs={'arg0' : x})
pr1.start()
pr2.start()
pr1.join()
pr2.join()

但是,执行此代码后,执行

print df1.dataframe
print df2.dataframe

我发现根本没有进行转换。 (虽然根据计算时间,当调用pr1.start()和pr2.start()时会发生一些事情。

有谁知道可能是什么原因?什么是解决方案?

非常感谢:)

P.s 下一步是'合并df1.dataframe和df2.dataframe。所以我也想知道我是否需要另一个函数 fun_wait_until_all_process_finished()然后再做pd.merge((df1.dataframe,df2.dataframe))

1 个答案:

答案 0 :(得分:0)

在我看来,使用 threading 模块是解决此问题的最佳方法。

为了便于使用,您可以使用decorator

import threading

def threaded(fn):
    def wrapper(*args, **kwargs):
        threading.Thread(target=fn, args=args, kwargs=kwargs).start()
    return wrapper

在定义之后,将装饰器添加到您想要进行线程化的函数/类方法中:

@threaded
def transform(self):
  self.dataframe = (some dataframe computations)
  return self.dataframe

然后只需调用该函数,就会自动创建一个线程:

c1 = class1(a)
c2 = class2(b)

c1.transform()
c2.transform()