urlretrieve 没有超时,需要通过socket来设置

socket.setdefaulttimeout(10)

而且还需要为他设置连接池,所以直接改用requests来下载文件

def download_file(self, url, filename):
r = self.session.get(url, stream=True)
with open(filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)

写原生爬虫遇到问题  can`t start new thread 自己的机器上一直没问题没发现,到了别人的机器上暴漏出来了。

原因是原生的thread在执行完成后并没有销毁退出,而是进入了sleeping状态,导致最后线程创建超出了允许的上限。其实通过修改Thread的初始化中的一些行为,可以使thread可以复用。

或者简单点,使用线程池来解决

from concurrent.futures.thread import ThreadPoolExecutor

def thread_run(target, args_list, max_thread=12):
with ThreadPoolExecutor(max_thread) as executor:
for arg in args_list:
executor.submit(target, arg)

还有一个问题就是 Connection pool is full, discarding connection

可以进行如下设置

session.mount(prefix='', adapter=HTTPAdapter(pool_connections=1, pool_maxsize=36, max_retries=1))

但是在多线程情况下还是会出现 pool is full。我把maxsize设置的比 threads数稍大一点时,就没有warning了,也可能是我代码还有隐藏的问题。

也可能跟线程池有关,暂时没看 线程池的源码,如果这样可以通过信号量来加锁

from threading import Semaphore

class AA():
sem = Semaphore(12) ... def getHtml():
sem.acquire()
session.get()
sem.release()

几个Python线程坑,和连接池的坑的更多相关文章

  1. python之requests urllib3 连接池

    0.目录 1.参考 2. pool_connections 默认值为10,一个站点主机host对应一个pool (4)分析 host A>>host B>>host A pag ...

  2. python中实现mysql连接池

    python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...

  3. python socketpool:通用连接池(转)

    简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...

  4. python socketpool:通用连接池

    简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...

  5. EFCore连接池的坑 差点晚年不保

    长话短说 上个月公司上线了一个物联网数据科学项目,我主要负责前端接受物联网事件,并提供 参数下载. webapp 部署在Azure云上,参数使用Azure SQL Server存储. 最近从灰度测试转 ...

  6. Python下Mysql数据连接池——单例

    # coding:utf-8 import threading import pymysql from DBUtils.PooledDB import PooledDB from app.common ...

  7. 阿里Druid连接池的坑。。

    Druid的坑 当查询数据库的Clob转换为Oracle Clob类型的时候. java.lang.ClassCastException: com.alibaba.druid.proxy.jdbc.C ...

  8. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

  9. Druid连接池默认配置和坑

    一.公司默认配置 ds_0: !!com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: ...

  10. Tomcat 连接池详解

    (转) JDBC 连接池 org.apache.tomcat.jdbc.pool 是Apache-Commons DBCP连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Co ...

随机推荐

  1. oracle to_char函数的用法

    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; 其中,HH24代表是24小时制的,mi代表分钟,不要写为mm

  2. unity学习笔记03-渲染管线

    图形数据在GPU上经过运算处理,最后显示在显示器上的过程 游戏→图形API→cpu→(DRAW CALL)交给GPU→顶点处理→图元装配→光栅化→像素处理→缓存 减少DRAW CALL  增加性能 O ...

  3. Vue v-once指令 和 v-pre指令

    v-once指令: 1.v-once 所在节点在初始化动态渲染后,就视为静态内容了 2.以后数据的改变不会引起v-once所在结构的更新,可用于优化性能 v-pre指令: 1.跳过其所在节点的编译过程 ...

  4. linux kali 报错Intel VT-x

    报错原因:第一次安装虚拟机intel vt-x 处于禁用状态,没有启用 分析思路:找到 Intel vt - x 位置,并打开 .(intel - x在bios) 解决方法: 联想笔记本为例:进入bi ...

  5. LOD Group

    LOD Group 调节摄像机距离,在不同的距离显示不同物体.常用于物体高低模之间的转换,如离摄像机较远时渲染低模物体,离摄像机较近时渲染高模物体.

  6. C#封装以及访问修饰符

    封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中".在面向对象程序设计方法论中,封装是为了防止对实现细节的访问. 抽象和封装是面向对象程序设计的相关特性.抽象允许相关 ...

  7. JAVA笔记:double四舍五入并保留两位小数的方法

    1.只要输出结果 double x1 = 0.026; System.out.println(String.format("%.2f", x1)); 2.数据转换 //方案一: g ...

  8. JS学习-PromiseWorker

    PromiseWorker PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise. PromiseWo ...

  9. Oracle dump文件的一些经验

    dump文件对于DBA而言再平常不过了.不过因为dump文件是二进制文件,我们平时使用中不太关注.再导入dump文件时有很多细节和技巧是值得注意的. 1.查看dump文件的一些基本信息 strings ...

  10. vue的双向绑定规则

    vue提供了v-model双向绑定指令,用来辅助在不操作DOM的前提下,快速读取表单的数据 <!DOCTYPE html> <html lang="en"> ...