jmeter模拟并发的原理
线程组
打开jmeter添加线程组后我们会看到如图界面。
主要探讨下 线程数 循环次数 是如何实现的。
``
线程的分配
这段代码的执行结果可以看到每次实例化之后,都会分配给不同的内存地址,表名每个线程都分配一个特定的内存。
import requests,threading
class Test():
def __init__(self):
self.session = requests.session()
print(id(self.session))
if __name__ == '__main__':
td_1 = Test()
td_2 = Test()
td_3 = Test()
td_4 = Test()
#这段代码的执行结果可以看到每次实例化之后,都会分配给不同的内存地址,表名每个线程都分配一个特定的内存。
下图的代码实例化之后进行了10次循环,这10次循环是同一个内存地址上进行的,没有实现并发的目的。
import requests,threading
class Test():
def __init__(self):
self.session = requests.session()
def start(self):
print(id(self.session))
if __name__ == '__main__':
td_1 = Test()
for i in range(10):
threading.Thread(target=td_1.start())
将实例化写在循环内部,每次循环都会从新分配内存地址,可以实现并发的功能。
import requests,threading
class Test():
def __init__(self):
self.session = requests.session()
def start(self):
print(id(self.session))
if __name__ == '__main__':
for i in range(10):
td_1 = Test()
threading.Thread(target=td_1.start())
每一个线程必须对应不同的session实例。
线程数和分配的内存地址的个数是一样的,经过上面的代码打底就清楚线程数是什么意思了。
循环次数表示的是每一个线程循环执行了多少次。
下面这个代码就可以说设置为:线程数3,循环次数2
输出结果为:
35612040
35612040
56028744
56028744
56028576
56028576
这种样子。
import requests,threading
class Test():
def __init__(self):
self.session = requests.session()
def start(self):
print(id(self.session))
if __name__ == '__main__':
for i in range(3):
td_1 = Test()
for j in range(2):
threading.Thread(target=td_1.start())
思考一个问题,一台电脑可以模拟多少个并发呢?
1)取决于CUP的性能,cpu性能越好模拟线程数越大。
2)内存越大,可分配的资源越多,可模拟的线程数也就越多。
3)每个线程占用资源也不一样,线程占用资源多自然就划分数目小。
4)电脑的瓶颈也会影响线程数。比如cpu性能很好但是内存满了,内存瓶颈就会影响线程数的运行。