python多线程坑_几个Python线程坑,和连接池的坑

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

socket.setdefaulttimeout(10)

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

defdownload_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):ifchunk:

f.write(chunk)

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

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

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

from concurrent.futures.thread importThreadPoolExecutordef thread_run(target, args_list, max_thread=12):

with ThreadPoolExecutor(max_thread) as executor:for arg inargs_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 importSemaphoreclassAA():

sem= Semaphore(12)

...defgetHtml():

sem.acquire()

session.get()

sem.release()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值