Python如何限制多线程的数量

在实现多线程扫描的时候,发生有趣的事情,扫描器多线程方式发起请求,结果目标站点就挂了,猝不及防,扫描器也无法获取到有效信息

并发数控制

一扫描,小一点的目标站点就拒绝服务了,这样可不行

多线程扫描

因此,需要限制多线程的数量

0x00 问题背景&思考

在一思考,怎么实现呐?

  • 通过队列方式,一个线程结束,另一个线程加入
  • 每当50个线程结束,另外50个线程再加入

上述两种方式中,第一种,其优点是限制了线程数,保证我们的服务器压力不会太大,其次我们在requestsheaders当中设置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多线程并发数量控制》

发表评论 / Comment

用心评论~