python多线程操作mysql连接池报AttributeError: 'NoneType' object has no attribute 'read'

近来在看python,然后准备使用python的多线程操作mysql的连接池(使用mysql的连接池效率会更高),先上代码,代码也比较简单,稍微会一点python的人都能看的懂的:

import threading
from DBUtils.PooledDB import PooledDB
import time
import pymysql
lock = threading.Lock()

class MysqlHelper():
   def __init__(self):
      self.__pool = PooledDB(creator=pymysql,
                  mincached=1,
                  maxcached=3,
                  maxconnections=3,
                  blocking=True,
                  user="root",
                  passwd="123456",
                  db="wangchao")

   def getConn(self):
      self.conn = self.__pool.connection()
      self.cursor = self.conn.cursor()

   def dispose(self):
      self.cursor.close()
      self.conn.close()

   def getOne(self, sql):
      self.getConn()
      self.cursor.execute(sql)
      rows = self.cursor.fetchall()
      print(rows)
      self.dispose()

def test1(pool):
   strsql = "select * from csv_test"
   while True:
      #lock.acquire()
      pool.getConn()

      pool.getOne(strsql)
      #lock.release()
      time.sleep(1)


def main(pool):
   for i in range(5):
      threading.Thread(target=test1, args=(pool,)).start()

if __name__ == "__main__":
   mysqlhelper = MysqlHelper()
   main(mysqlhelper)
   while True:
      time.sleep(1)

当时当代码跑起来的时候(我用的是pycharm开发的),一直出错,出现的错误有:

AttributeError: 'NoneType' object has no attribute 'read'

struct.error: unpack_from requires a buffer of at least 8 bytes,已报错线程就直接退出了(当然线程处理函数写的很简单),在网上查了很多资料都是单线程操作mysql连接池的,很少有多线程的例子,直接把错误贴到网上也找不到解决办法。但是看了这博友https://blog.csdn.net/qq_29666899/article/details/82990599的帖子,我试了一下在线程处理函数中,使用连接池先后都加锁(即把红色生效),然后就不会报错了,现在什么原因也不是很清楚,还请路过的大神指点。但是我感觉应该是多线程共享mysql连接池的问题。

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: AttributeError: 'NoneType' object has no attribute,简单来说就是出现了属性错误,因为NoneType类型的对象没有该属性。 在Python中,None表示一个空对象,是一个特殊的类型,而该错误就是因为一个对象被识别为NoneType类型。在这种情况下,程序试图访问该对象的某个属性,但是该属性并不存在,因此就会出现“AttributeError: 'NoneType' object has no attribute”错误。 通常情况下,这种错误出现在程序中某些变量的赋值或者函数的返回值没有正确处理的情况下。要解决这个错误,可以使用if语句来判断该对象是否为NoneType类型,如果是,则不执行该对象的任何属性操作,这样就可以避免出现该错误。同时,也可以修改代码,使其返回正确的类型或者检查变量的赋值情况。 总的来说,AttributeError: 'NoneType' object has no attribute是一个常见的Python错误,需要注意在使用对象属性时避免出现该错误,并且及时处理代码中出现的异常情况。 ### 回答2: 在Python编程中,当我们尝试使用变量或对象的属性时,如果这个对象是None类型的,会产生"attributeerror: 'nonetype' object has no attribute"错误。这是因为NoneType对象是一种特殊的空对象,它没有任何属性和方法可以调用。 通常,在出现这种错误时,我们应该首先检查代码中的变量或对象是否已经正确地初始化或者有没有正确地传递参数。同时,我们还应该查看程序逻辑是否正确,以确保不会出现NoneType对象的情况。 可以通过一些特殊的方法来避免这种错误。例如,我们可以使用try-except语句来捕捉这种错误并处理它,或者使用assert语句来确保对象不是None类型。此外,我们还应该及时记录和解决这种错误,以避免产生更严重的后果。 在实际编程中,尽可能地避免使用NoneType对象可以减少这种错误的发生。例如,我们可以使用默认值或者空列表来替代NoneType对象,这样可以避免调用空对象的属性和方法时出现错误。同时,我们还可以在函数或者方法中添加参数的类型检查,以确保输入的参数不是NoneType对象。 总之,尽可能地避免使用NoneType对象,以及在代码中添加安全检查和错误处理可以有效地减少"attributeerror: 'nonetype' object has no attribute"错误的发生。 ### 回答3: `AttributeError: 'NoneType' object has no attribute`这个错误通常出现在Python代码中,主要是由于代码中使用了空值对象,也就是None,但是该对象没有期望的属性或方法,从而引发了该错误。 举个例子,我们假设在调用一个函数时,我们使用了一个空值对象,但是该对象没有期望的属性或方法,这样就会出现`AttributeError: 'NoneType' object has no attribute`的错误。例如: ```python def get_name(): return None name = get_name() print(name.upper()) ``` 在上面的代码中,`get_name()`函数返回了一个空值对象None,然而我们试图调用None对象的`upper()`方法,但是None对象是没有`upper()`方法的,因此就会出现`AttributeError: 'NoneType' object has no attribute 'upper'`的错误。 这个错误的解决方法是,我们需要在调用方法或属性之前,先判断该对象是否为空值对象。例如,在上面的代码示例中,我们可以使用如下代码来避免这个错误: ```python def get_name(): return None name = get_name() if name: print(name.upper()) ``` 在这里,我们通过判断`name`对象是否为空值对象来避免了`AttributeError`错误的出现。 除此之外,如果我们确定该对象不应该为空值对象,那么我们需要检查代码逻辑是否产生了错误,例如调用了未定义的函数、变量名拼写错误等问题。如果仍然无法解决问题,我们可以尝试使用调试工具对代码进行排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落水铅华

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值