由於項目要做一個並發測試,由於斷言的東西較多,決定手寫腳本。於是用python寫了腳本:
def test_method(thread_no):
print("%s===test_method running %s" % (ctime(), thread_no))
r = requests.post(url=url, json=params, headers=headers)
print(r.cookies)
print(r.text)
status = r.json()["status"]
assert status == 200
if __name__ == '__main__':
# test_method(1)
print("""並發測試xxxxxxx""")
threads = []
for i in range(vuser_count):
name = threading.Thread(target=test_method, args=("線程" + str(i + 1),))
threads.append(name)
for t in threads:
t.setDaemon(True)
t.start()
for t in threads:
t.join()
print("執行完畢")
其實這段代碼咋一看沒什么問題,但是需要思考一下python的多線程!!!
但python由於歷史遺留的問題,嚴格說多個線程並不會同時執行(沒法有效利用多核處理器,python的並發只是一個核心的交替執行不同的代碼)。
解釋器執行代碼時,有一個GIL鎖:Global Interpreter Lock,任何Python線程執行前,必須先獲得GIL鎖,然后,每執行100條字節碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執行。
這個GIL全局鎖實際上把所有線程的執行代碼都給上了鎖,所以,多線程在Python中只能交替執行,即使100個線程跑在100核CPU上,也只能用到1個核。所以python的多線程並發並不能充分利用多核,並發沒有java的並發嚴格
Java可以有效利用多核心!!!可以改用java來實現。
