AttributeError: Can‘t get attribute ‘xx‘ on <module ‘__main__‘ (built-in)>

使用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)

代码就成功运行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值