使用python在给自己搭建的博客做并发的测试时,遇到一个问题是所有的任务都分配了,主线程需要等待所有的子线程结束并返回状态码来判断此次的请求是否成功,若直接使用sleep无法确定等待时间,所以需要等待所有的子线程得到rsp响应,这个过程是需要花费一定的时间的

在之前试过创建几千个线程并发,当大于两千多的时候,电脑直接不行了,似乎是一个进程不能创建超过2048个线程,这或许和电脑的各种硬件配置也有关系的,而且在测试的过程中,使用wireshark抓包发现在一秒钟中实际最多存在了350左右条请求发送

当存在很多个线程时,应当将所有创建了的子线程加入到一个列表中,再一次循环出来让其join(),既可以解决此问题

一个并发测试

#coding:utf-8#
import requests
import time
from threading import Thread
from Queue import Queue

def test():
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
    rsp = requests.get('http://www.testone.top/',headers=headers)
    if rsp.status_code != 200:
        queue_fail.put('-')#若请求不成功在队列中添加一个消息,用来统计所有失败的请求
    else:
        queue_pass.put('-')#若请求成功在队列中添加一个消息,用来统计所有成功的请求

def main():
    join_list = [] #用来存储所有的线程
    number = 150
    for i in range(number):
        t = Thread(target=test)
        t.start()
        join_list.append(t)
    for i in join_list: #将所有的线程join(),让主线程依次等待所有的子线程结束
        i.join()

if __name__ == '__main__':
    queue_fail = Queue()
    queue_pass = Queue()
    s_time = time.time()
    main()
    print('>> >> >> >> >> >> >> >> >> >>')
    print('运行时间:%f秒'%(time.time()-s_time))
    print('测试总请求数量:%s'%(queue_pass.qsize()+queue_fail.qsize()))
    print('请求成功数量:%s'%(queue_pass.qsize()))
    print('请求失败数量:%s'%(queue_fail.qsize()))
    print('成功率为:%.2f%%'%(100*(float(queue_pass.qsize())/(queue_pass.qsize()+queue_fail.qsize()))))
    print('失败率为:%.2f%%'%(100*(float(queue_fail.qsize())/(queue_pass.qsize()+queue_fail.qsize()))))
    print('>> >> >> >> >> >> >> >> >> >>')

测试结果:

1.当每秒并发请求为:50时,可以看出服务器均能正常响应所有的请求

>> >> >> >> >> >> >> >> >> >>
运行时间:9.851000秒
测试总请求数量:50
请求成功数量:50
请求失败数量:0
成功率为:100.00%
失败率为:0.00%
>> >> >> >> >> >> >> >> >> >>

2.当每秒并发请求为:100时,可以看出服务器均能正常响应所有的请求

>> >> >> >> >> >> >> >> >> >>
运行时间:19.928000秒
测试总请求数量:100
请求成功数量:100
请求失败数量:0
成功率为:100.00%
失败率为:0.00%
>> >> >> >> >> >> >> >> >> >>

3.当每秒并发请求为:150时,可以看到服务器开始有响应失败的请求了

>> >> >> >> >> >> >> >> >> >>
运行时间:29.558000秒
测试总请求数量:150
请求成功数量:149
请求失败数量:1
成功率为:99.33%
失败率为:0.67%
>> >> >> >> >> >> >> >> >> >>

 

4.当增加到200,之后的请求基本都是失败了

>> >> >> >> >> >> >> >> >> >>
运行时间:29.764000秒
测试总请求数量:200
请求成功数量:149
请求失败数量:51
成功率为:74.50%
失败率为:25.50%
>> >> >> >> >> >> >> >> >> >>

5.增加到250

>> >> >> >> >> >> >> >> >> >>
运行时间:29.778000秒
测试总请求数量:250
请求成功数量:149
请求失败数量:101
成功率为:59.60%
失败率为:40.40%
>> >> >> >> >> >> >> >> >> >>

6.增加到300

>> >> >> >> >> >> >> >> >> >>
运行时间:29.716000秒
测试总请求数量:300
请求成功数量:149
请求失败数量:151
成功率为:49.67%
失败率为:50.33%
>> >> >> >> >> >> >> >> >> >>