在实现多线程扫描的时候,发生有趣的事情,扫描器多线程方式发起请求,结果目标站点就挂了,猝不及防,扫描器也无法获取到有效信息
一扫描,小一点的目标站点就拒绝服务了,这样可不行
因此,需要限制多线程的数量
0x00 问题背景&思考
在一思考,怎么实现呐?
- 通过队列方式,一个线程结束,另一个线程加入
- 每当50个线程结束,另外50个线程再加入
上述两种方式中,第一种,其优点是限制了线程数,保证我们的服务器压力不会太大,其次我们在requests
的headers
当中设置Connection: close
,以此保证请求不是长连接
第二种方式,类似与第一任务批结束后,第二批次任务统一进入工作区,为什么会有这种想法呐?因为有的服务器不仅限制了并发量,还限制了时间间隔,但整体上来说,限制的应该还是并发数
根据测试数据显示,一般的小网站(包括一些公司官网,这种都是一台服务器上有多个网站,外包的那种)并发峰值在35~70区间
因此我们选择并发线程数为30,因为规则比较多,同时避免因为超高频率导致的IP被ban,即使是漏扫了部分链接,也是可以接受
综上因素,选择第一种方式
0x01 实现代码:
部分代码,仅作参考:
THREADMAX = threading.BoundedSemaphore(30) # 限制线程的最大数量为30个 def get_html2(url='', key=''): # coding... THREADMAX.release() def get_info(url=''): # coding... for item in payload_list: THREADMAX.acquire() thd = threading.Thread(target=get_html2, args=(item[1], item[0], )) thd.start() thread_list.append(thd) for thd in thread_list: thd.join()
这是非常简单的一种方式
另外推荐一篇:《python多线程并发数量控制》
版权声明:《 Python如何限制多线程的数量 》为DYBOY原创文章,转载请注明出处!
最后编辑:2019-7-28 15:07:55