Python多線程並發的誤區


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM