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. Prometheus API说明

    本文来自Prometheus官网手册 和 Prometheus简介,https://www.cnblogs.com/zhoujinyi/p/11955131.html HTTP API 在Promet ...

  2. Security Bulletin: IBM WebSphere Application Server is vulnerable to a remote code execution vulnerability (CVE-2023-23477)

    Skip to content     Support     DownloadsDocumentationForumsCasesMonitoringManage support account   ...

  3. dynamics 365/crm 导入解决方案报 发生 sql server 错误

    dynamics 365/crm 导入解决方案报 发生 sql server 错误.{1}{0} 错误代码 80044150. 帮助我解决此问题. 这时候,可以检查数据库服务器的日志看看,可能会找到S ...

  4. C# Linq不同类型数组之间的转换

    string[] strArray = "a,b,c,d,e,f,g".Split(new char[]{ ',' }); int[] intArray; //C# 3.0下用此句 ...

  5. 87、linux root 密码忘记了

    子账户登录,然后重置即可

  6. 046_salesforce 中 Get URL

    Suppose u have the whole URL as: < https://cs14.salesforce.com/apex/myVFpage?id=906F00000008w9wIA ...

  7. 简单的WPF客户端应用开发

    1.使用vs创建一个新项目,选择wpf应用 2.创建好项目,在视图=>工具箱,选择要使用的部件 3.单击部件可以改变部件的显示信息,即content的内容就是显示的信息,name为部件的名称,在 ...

  8. signalR client属性中的大致方法

    T All { get; } 相当于持久连接中的 Broadcast. T AllExcept(params string[] excludeConnectionIds); 给排除本人所有人发送消息. ...

  9. VS2012下没有ADO.NET实体数据模型

    在C盘下搜"EFTools.msi"然后退出VS,点击修复在打开VS,数据下就有了

  10. NSSM 软件参数使用教程

    NSSM 一款可以自定义为软件安装守护进程的软件 NSSM: The non-sucking service manager Version 2.24-101-g897c7ad 64-bit, 201 ...