zoukankan      html  css  js  c++  java
  • 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来实现。

  • 相关阅读:
    [C#] 主窗口嵌入子窗口(绑架窗口)
    【WP7】后台加载数据BackgroundWorker
    【WP7】手势操作与拨号键盘
    【算法】拼音匹配算法(支持多音字)
    【笔记】歌词显示问题
    【笔记】使用千千静听服务器下载歌词
    【WP7】代码创建png图片
    【WP7】自定义字体
    【WP7】对象序列化
    【WP7】控件倾斜特效
  • 原文地址:https://www.cnblogs.com/byron0918/p/9604074.html
Copyright © 2011-2022 走看看