如果模块"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 上不可用。