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()

最新文章

  1. 【前端】使用readline模块实现Node.js的输入输出
  2. Spark 1.6以后的内存管理机制
  3. java工程笔记
  4. 为Elasticsearch添加中文分词,对比分词器效果
  5. POI读写Excel简述之读取
  6. jenkins邮件模板
  7. javaee学习之servlet
  8. SQL Server 监控 使用sp_trace_create
  9. 模拟log4j获取日志对象调用所在的类名、方法名及行号
  10. Web Api 控制器
  11. bzoj2038
  12. ASPNETMVC多语言方案
  13. WinForm中TextBox 中判断扫描枪输入与键盘输入
  14. 构建高性能web站点笔记一
  15. SharePoint Search之(两)持续抓取Continues crawl
  16. 【Socket】苍老师有了丈夫,我也有了SAEA
  17. DevOps之三 Git的安装与配置
  18. 视频信号中xyz的提取
  19. Vue之axios请求数据
  20. matlab练习程序(最小二乘多项式拟合)

热门文章

  1. spring-cloud项目初始化问题
  2. 百度云+Zotero进行知识管理的方法
  3. js 判断gps是否超出设定范围
  4. Java项目引入第三方Jar包
  5. Twitter Bootstrap Grid System
  6. 使用CMD创建任意文件
  7. vite2.9 + vue3.2 打包部署到nginx上刷新页面404问题
  8. Dinic的几种复杂度
  9. mybatis查询返回多条数据
  10. 1.1 WCF SOA架构和webservice