感悟】

写完这篇日志后,有调了一段时间程序,又有了一点心得分享下:

一)爬稳定的数(dong)据(xi)最好存储下来,特别是数据库在国外的那种,下载时间成本太高昂了,存起来再处理,会节约很多时间;

二)对于python使用多线程写数据到sqlite数据库的做法绝对是浪费感情,是扯淡的行为,一个词叫“大材小用”,单线程足够了。

三)写数据到数据库中commit的次数最好减少,可以10000条insert后commit,当然这取决于事务本身和其他因素,我这里可以提升一倍的速度。

四)回到爬的数据上,文本形式存储对于散户使用是最优的,处理速度快,格式定义好,正则等功能完胜sqlite。

【问题情境】

最近手闲,想写一个简单的批量下载网页的python工具。当然爬虫的轻量级框架scrapy以前用过,还不错。因为这次需求很简单,就直接人肉搞了。结果各种问题就出来了。

其中的思路是,多线程数据库存储这些网页,也方便之后数据处理。但是跑多线程时,脚本经常死掉。开了50个线程,基本出现的错误提示就是"Recursive use of cursors not allowed".

【问题分析】

数据库跑多线程的故事吧,一般都是事务没提交无法保证原子性的问题。问题解决方案可直接看下面的【问题解决】部分。

检查了第一遍:

问题1:发现有个查询语句select没有提交,commit了一下。

分析1:这里感觉没有什么问题,因为查询没有改变数据库所以不提交也一样。

跑一遍:

似乎错误提示少了一些。此时,我insert数据的sleep时间是1sec.试了几遍,还是中途崩掉。

检查第二遍:

问题2:缩短insert的sleep时间,问题更严重了。很快姐崩了。

分析2:应该是insert频繁导致的sql语句冲突概率增加。总感觉这里有问题,就差了下资料,果然是sqlite3多线程的时候有猫腻。于是,在每个提交的位置都增加了线程锁,增强同步效果。

跑了一遍:

错误提示"Recursive use of cursors not allowed"没有再出现。

【解决方案】

加锁,提交。

lock = threading.Lock()

def Func(host,cursor,db):
  try:
    lock.acquire(True)
    res = cursor.execute('''...''',(host,))
    # do something
  finally:
    lock.release()

【其他】

python的sqlite3使用多线程的参数check_same_thread是需要的:

self.conn = sqlite3.connect(dbname, check_same_thread=False)

版权声明:本文为CSDN博主「counsellor」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/counsellor/article/details/43715007

Sqlite3错误:Recursive use of cursors not allowed 的解决方案的更多相关文章

  1. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  2. Visual studio 中编译错误SQL71006: Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements.

    把写好的sql脚本,并在mssqlmanager里面编译成功的存储过程脚本复制到vs项目下,出现错误信息如下:SQL71006: Only one statement is allowed per b ...

  3. 【c++错误】类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)

    今天编写类的程序的时候不小心把类后的分号忘写了,就出现上面的错误提示. 顺便复习下类的正确格式: class 类名 { public: //习惯上将公有类型放在前面,便于阅读 ……(外部接口) pro ...

  4. 解决Gearman 报sqlite3错误

    删除了系统原带的sqlite3 ,到官网上下一个源码,重新编译安装sqlite3. 如:把sqlite3安装到 /usr/local/sqlite3tar zxf sqlite3.xxxx.tar.g ...

  5. Hive错误:User root is not allowed to impersonate anonymous

    修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项: <property> <name>hadoop.proxyuser.root.h ...

  6. spring整合之后运行报什么只读错误。Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

    解决办法, 再大dao的实现类上添加注解: @Transactional(readOnly = false ) 不让它只读就行了

  7. iOS上传应用过程中出现的错误"images contain alpha channels or transparencies"以及解决方案

    如何取消图片透明度  本文永久地址为 http://www.cnblogs.com/ChenYilong/p/3989954.html,转载请注明出处. 当你试图通过<预览>进行" ...

  8. MySQL报错:Packets larger than max_allowed_packet are not allowed 的解决方案

    在导大容量数据特别是CLOB数据时,可能会出现异常:“Packets larger than max_allowed_packet are not allowed”. 这是由于MySQL数据库有一个系 ...

  9. 引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案

    引起标题上所导致的错误是因为你的第三方库没有放入到Compile Sources里面去. 需要到你项目的Targets>>Build Phases>>Compile Sourc ...

随机推荐

  1. extra bytes at beginning or within zipfile

    主要用文本文档打开看看是否带有#!/bin/bash 修改pom文件<executable>false</executable>

  2. windows服务与log4net应用

    有时候我们需要用到window服务来执行定时任务,然后配合log4net记录程序运行情况,这里简单记录下配置的整个过程以及注意要点: 一.添加windows服务 1.设计页面,右键添加安装程序

  3. JavaScript02

    一. 判断// 三元表达式// 循环// 判断: 用的最多的就是if判断// 1.// if(条件){// 当条件满足以后执行的语句// } // 2.// if(条件){// // }else{// ...

  4. struts-2.5.14.1 中web.xml的基本配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  5. Spark的Shuffle

    0. Shuffle概述 要理解什么是Shuffle,首先介绍大数据与分布式.我们知道大数据的存储是分布式存储,大数据的计算框架是分布式的计算框架.分布式必然存在数据的交互传输,简言之Shuffle就 ...

  6. 前端基础(十):Bootstrap Switch 选择框开关控制

    简介 Bootstrap Switch是一款轻量级插件,可以给选择框设置类似于开关的样式 它是依赖于Bootstrap的一款插件 下载 下载地址 在线引用 导入 因为它是依赖于Bootstrap的一款 ...

  7. 多线程threading模块

    python的多线程编程 简介 多线程编程技术可以实现代码并行性,优化处理能力,同时功能的更小划分可以使代码的可重用性更好.Python中threading和Queue模块可以用来实现多线程编程. 详 ...

  8. “System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 第一种,权限不够,在项目运行的时候弹出==>解决方法:以管理员权限运行vs ...

  9. tigervnc-server安装

    #vncserver安装方法 #su - root rpm -ivh tigervnc-server-1.8.0-13.el7.x86_64.rpm cp /lib/systemd/system/vn ...

  10. java 中 IO 流分为几种?(未完成)

    java 中 IO 流分为几种?(未完成)