使用多处理加载 Python 动态模块



如果模块"user.py"与代码位于同一目录中,则以下代码有效,但如果它位于不同的目录中,则失败。我收到的错误消息是"模块未找到错误:没有名为'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?我尝试了不同的方法,例如修改我的路径然后导入用户和导入库,结果都相同。

我正在使用Windows 7和Python 3.6

multiprocessing试图假装它就像threading一样,但抽象像筛子一样泄漏。它泄漏的方式之一是与工作进程通信涉及大量隐式挑剔和数据复制。

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

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

相关内容

  • 没有找到相关文章

最新更新