由於項目要做一個並發測試,由於斷言的東西較多,決定手寫腳本。於是用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來實現。