-1

如果模块“user.py”与代码位于同一目录中,则以下代码有效,但如果它位于不同目录中则失败。我收到的错误消息是“ModuleNotFoundError: No module named '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

4

1 回答 1

2

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

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

这个问题的表现方式是依赖于操作系统的,因为如果多处理使用forkuser start 方法,工作人员会从主进程继承模块。fork在 Unix 上是默认设置,但在 Windows 上不可用。

于 2018-04-12T23:50:47.830 回答