如何在python中的多处理目标函数中对全局数据帧执行?

如何在python中的多处理目标函数中对全局数据帧执行?,python,multiprocessing,python-multiprocessing,multiprocess,Python,Multiprocessing,Python Multiprocessing,Multiprocess,我有以下代码。我想使用python多进程对全局数据帧df使用calculate\u mi函数计算所有对的值 from multiprocess import Pool def calculate_mi(pair): global df from pyitlib import discrete_random_variable as drv import numpy as np i, j = pair val = ( 2*drv.information_mutual(df[i]

我有以下代码。我想使用python多进程对全局数据帧df使用calculate\u mi函数计算所有对的值

from multiprocess import Pool

def calculate_mi(pair):
  global df
  from pyitlib import discrete_random_variable as drv
  import numpy as np
  i, j = pair
  val = ( 2*drv.information_mutual(df[i].values.astype(np.int32), df[j].values.astype(np.int32)) ) / ( drv.entropy(df[i].values.astype(np.int32)) + drv.entropy(df[j].values.astype(np.int32)) )
  return (i,j), val

def calculate_value(t_df):
  global df
  df = t_df
  all_pair = [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]

  pool = Pool()
  pair_value_list = pool.map(calculate_mi, all_pair)
  pool.close()
  print(pair_value_list)

def calc():
  data = {'1':[1, 0, 1, 1],
    '2':[0, 1, 1, 0],
    '3':[1, 1, 0, 1],
    '0':[0, 1, 0, 1] }

  t_df = pd.DataFrame(data)
  calculate_value(t_df)

if __name__ == '__main__':
  calc()
这段代码为我提供了google colab平台中的预期输出。但是当我在本地机器上运行它时,它会出现以下错误。(我使用的是Windows10、anaconda、jupyter笔记本、python 3.6.9)。我如何解决这个问题,或者是否有其他方法?
首先,有几件事:

  • 它应该是:
    来自多进程导入池
    (而不是
    来自多进程
  • 您似乎忽略了导入
    pandas
  • 继续

    问题是在Windows下,新进程的创建不是使用
    fork
    调用完成的,因此子进程不会自动继承全局变量,如
    df
    。因此,您必须初始化每个子进程,以便在创建
    池时使用初始化器正确初始化全局变量
    df

    from multiprocessing import Pool
    import pandas as pd
    
    def calculate_mi(pair):
      global df
      from pyitlib import discrete_random_variable as drv
      import numpy as np
      i, j = pair
      val = ( 2*drv.information_mutual(df[i].values.astype(np.int32), df[j].values.astype(np.int32)) ) / ( drv.entropy(df[i].values.astype(np.int32)) + drv.entropy(df[j].values.astype(np.int32)) )
      return (i,j), val
    
    # initialize global variable df for each sub-process
    def initpool(t_df):
        global df
        df = t_df
    
    def calculate_value(t_df):
      all_pair = [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
    
      # make sure each sub-process has global variable df properly initialized:    
      pool = Pool(initializer=initpool, initargs=(t_df,))
      pair_value_list = pool.map(calculate_mi, all_pair)
      pool.close()
      print(pair_value_list)
    
    def calc():
      data = {'1':[1, 0, 1, 1],
        '2':[0, 1, 1, 0],
        '3':[1, 1, 0, 1],
        '0':[0, 1, 0, 1] }
    
      t_df = pd.DataFrame(data)
      calculate_value(t_df)
    
    if __name__ == '__main__':
      calc()
    

    据我所知,Ipython jupyter笔记本至今不支持
    多处理。但是它支持
    multiprocess
    模块,这是[multiprocessing]()的一个分支,这就是为什么我在使用jupyter笔记本时使用它的原因。这段代码工作正常,但如果我使用
    numpy
    drv
    模块之外的
    calculate\mi
    函数,它会给出错误,即“名称‘drv’未定义”。是否有任何方法可以在
    calculate\u mi
    函数之外导入此函数并供所有子进程使用?[N.B.我已将它们放置在
    initpool
    方法中,它仍然显示相同的错误]首先,存在一个错误。使用
    多处理
    全局导入
    numpy
    时,我从来没有遇到过问题。如果你说这是多进程的问题,那么根据我给你看的链接切换到多进程,或者停止使用jupyter笔记本。另外,如果你不使用上下文管理器,例如,使用池(…)作为池:
    ,它会正确终止池,然后在你调用
    Pool.close()
    ,您应该真正调用
    pool.join()
    。请参阅:
    多处理
    多处理
    模块之间的区别是什么,或者该模块是否存在任何缺点。你为什么建议使用
    多进程
    而不是
    多进程
    ?我不熟悉
    多进程
    ,当我去
    PyPi
    存储库查找它时,我从描述中学不到很多东西。。所以我建议什么是标准,我知道什么应该起作用。