使用Jupyter notebook,学习multiprocessing模块(Python中的并行处理(Pool.map()、Pool.starmap()、Pool.apply()、)_python pool.map-优快云博客)时,运行该作者的代码没有任何反应,发现Jupyter notebook的黑色窗口写着AttributeError: Can't get attribute 'howmany_within_range' on <module '__main__' (built-in)>。
原问题代码:
# 1.生成数据data
import numpy as np
np.random.RandomState(100) #RandomState()是一个伪随机数生成器
arr = np.random.randint(0, 10, size=[100, 5]) # 0,10是生成0到10的随机整数;size=[100, 5],即生成100行,一列的ndarray(二维矩阵的形式,每个里面5个元素)
data = arr.tolist() # 将numpy.ndarray 转化为list
# 2.定义计算范围内元素个数的函数
def howmany_within_range(row, minimum, maximum): #定义函数howmany_within_range()检查每个row中的元素有多少个在给定范围中,并返回计数
count = 0
for n in row:
if minimum <= n <= maximum:
count += 1
return count
# 3.用pool.apply()进行并行化处理
import multiprocessing as mp
if __name__ == '__main__':
'''1.初始化 multiprocessing.Pool()'''
pool = mp.Pool(mp.cpu_count()) # mp.Pool(4)表示创建一个包含4个进程的进程池pool
'''2.使用apply(), 将函数howmany_within_range作为主参传进去'''
results = [pool.apply(howmany_within_range, args=(row, 4, 8)) for row in data]
'''3. 不要忘记关闭进程'''
pool.close()
print(results)
发生该报错的原因参考这篇文章(https://www.cnblogs.com/longyuu/p/14247847.html)的'【windows下正常运行】'和'【windows下ipython运行】'。
解决方法:把def函数的内容保存到一个.py文件中,然后在.ipynb文件中import该函数。
这里我新建了一个.py文件,把howmany_within_range函数的定义写进去,保存为aaa.py
def howmany_within_range(row, minimum, maximum): #定义函数howmany_within_range()检查每个row中的元素有多少个在给定范围中,并返回计数
count = 0
for n in row:
if minimum <= n <= maximum:
count += 1
return count
接下来在.ipynb文件中,导入aaa.py文件中的该函数:
#1.和#3.都没有变,只是将#2.的定义函数变为导入函数:from aaa import howmany_within_range,完整代码如下
# 1.生成数据data
import numpy as np
np.random.RandomState(100) #RandomState()是一个伪随机数生成器
arr = np.random.randint(0, 10, size=[100, 5]) # 0,10是生成0到10的随机整数;size=[100, 5],即生成100行,一列的ndarray(二维矩阵的形式,每个里面5个元素)
data = arr.tolist() # 将numpy.ndarray 转化为list
print('随机生成的data为',data)
# 2.导入计算范围内元素个数的函数
from aaa import howmany_within_range
# 3.用pool.apply()进行并行化处理
import multiprocessing as mp
if __name__ == '__main__':
'''1.初始化 multiprocessing.Pool()'''
pool = mp.Pool(mp.cpu_count()) # mp.Pool(4)表示创建一个包含4个进程的进程池pool
'''2.使用apply(), 将函数howmany_within_range作为主参传进去'''
results = [pool.apply(howmany_within_range, args=(row, 4, 8)) for row in data]
'''3. 不要忘记关闭进程'''
pool.close()
print(results)
代码就成功运行了