Python动态模块加载多处理

时间:2018-04-12 22:08:17

标签: python multiprocessing imp

如果模块“user.py”与代码位于同一目录中,则以下代码有效,但如果它位于不同的目录中则失败。我得到的错误消息是“ModuleNotFoundError:没有名为'user'的模块

import multiprocessing as mp
import imp

class test():
    def __init__(self,pool):

        pool.processes=1
        usermodel=imp.load_source('user','D:\\pool\\test\\user.py').userfun
         #file D:\\pool\\test\\user.py looks like this:
         #   def userfun():
         #      return 1

         vec=[]
         for i in range(10):
            vec.append([usermodel,i])

         pool.map(self.myfunc,vec)

    def myfunc(self,A):
        userfun=A[0]
        i=A[1]
        print (i,userfun())
        return

if __name__=='__main__':
    pool=mp.Pool()
    test(pool)

如果在没有池化过程的情况下调用函数myfunc,则无论user.py是在主代码的同一目录中还是在\ test中,代码都可以。为什么池化进程在单独的目录中找不到user.py?我尝试了不同的方法,例如修改我的路径然后导入用户和importlib,所有方法都具有相同的结果。

我正在使用Windows 7和python 3.6

1 个答案:

答案 0 :(得分:0)

multiprocessing试图假装它就像threading一样,但抽象漏洞像筛子一样。泄漏的一种方式是与工作流程进行通信涉及隐式酸洗和数据复制的批次

当您尝试将usermodel发送给工作人员时,multiprocessing会隐式地将其发送并尝试让工作人员解开泡菜。通过记录模块名称和功能名称来腌制功能,因此工作人员认为它应该from user import userfun来访问userfun。它不知道user需要从特定文件系统位置加载imp.load_source,因此无法重建usermodel

此问题的显示方式取决于操作系统,因为如果多处理使用 fork start方法,则worker将从主进程继承user模块。 fork 在Unix上是默认的,但在Windows上不可用。