支持多線程-->同步互斥-->加鎖-->超級(jí)鎖(把解釋器鎖住了)-->在同一時(shí)刻,解釋器只能解釋一個(gè)線程-->由于歷史原因,大量的python庫(kù)延用了這種方法-->導(dǎo)致python多線程效率低下GIL問(wèn)題:由于pythond的全局解釋器鎖造成python的多線程效率低下解決方法:1,不使用線程,使用多進(jìn)程2,不使用C/c++做解" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python-GIL

系統(tǒng) 2309 0

python線程之GIL

python的線程bug:GIL: Global Interpreter Lock 全局解釋器鎖

Python --> 支持多線程 --> 同步互斥 --> 加鎖 --> 超級(jí)鎖(把解釋器鎖住了)
--> 在同一時(shí)刻,解釋器只能解釋一個(gè)線程 --> 由于 歷史原因,大量的python庫(kù)延用了這種方法
--> 導(dǎo)致python多線程效率低下


GIL問(wèn)題: 由于pythond 的全局解釋器鎖造成python的多線程效率低下

解決方法:
1, 不使用線程,使用多進(jìn)程
2, 不使用C/c++ 做解釋器;用C# java做解釋器
3, Python多線程適合高用時(shí)的IO操作,如網(wǎng)絡(luò)IO;不適合CPU密集型程序


GIL帶來(lái)的影響:
多進(jìn)程效率 > 單進(jìn)程效率 > 多線程效率

代碼案例,延時(shí)CPU密集型程序和IO密集型程序?qū)芜M(jìn)程,多進(jìn)程,多線程的耗時(shí)測(cè)試:

            
              #!/usr/bin/python3
#coding:utf-8

from time import time,sleep
from threading import Thread
from multiprocessing import Process


#cpu開(kāi)銷(xiāo)函數(shù),計(jì)算15000W次
def cpu_cost(x, y):
    count = 1
    for _ in range(5000000):
        count += 1
        x += 1
        y += 1


#自定義IO開(kāi)銷(xiāo)函數(shù),進(jìn)行10W次寫(xiě),100W次讀操作
def io_cost():
    f = open('/tmp/test.log', 'w')
    for I in range(100000):
        f.write('Hello Python.')
    f.close()
    f = open('/tmp/test.log', 'r')
    for I in range(1000000):
        f.readline()
    f.close()


#單進(jìn)程cpu密集型
def single_cpu():

    t1 = time()
    for _ in range(10):
        cpu_cost(1,1)
    t2 = time()
    print('單進(jìn)程CPU密集型耗時(shí):',t2 - t1)
    sleep(2)


#單進(jìn)程IO密集型
def single_io():
    t1 = time()
    for _ in range(10):
        io_cost()

    t2 = time()
    print('單進(jìn)程IO密集型耗時(shí):',t2 - t1)
    sleep(2)


#多進(jìn)程CPU密集型
def mul_process_cpu():
    t1 = time()
    process_lst = []

    for I in range(10):
        p = Process(target=cpu_cost, args = (1,1))
        p.start()

    for I in process_lst:
        I.join()
    t2 = time()
    print('多進(jìn)程CPU密集型耗時(shí):',t2 - t1)
    sleep(2)


#多進(jìn)程IO密集型
def mul_process_io():
    t1 = time()
    process_lst = []
    for I in range(10):
        p = Process(target=io_cost)
        process_lst.append(p)
        p.start()

    for I in process_lst:
        I.join()
    t2 = time()
    print('多進(jìn)程IO密集型耗時(shí):',t2 - t1)
    sleep(2)


#多線程CPU密集型
def mul_thread_cpu():
    t1 = time()
    t_lst = []
    for _ in range(10):
        t = Thread(target=cpu_cost, args=(1,1))
        t_lst.append(t)
        t.start()

    for J in t_lst:
        J.join()
    t2 = time()
    print('多線程CPU密集型耗時(shí):',t2 - t1)
    sleep(2)


#多線程IO密集型
def mul_thread_io():
    t1 =time()
    t_lst = []
    for _ in range(10):
        t = Thread(target=io_cost)
        t_lst.append(t)
        t.start()
    for J in t_lst:
        J.join()
    t2 = time()
    print('多線程IO密集型耗時(shí):',t2 - t1)


#主程序
def main():
    single_cpu()
    single_io()
    mul_process_cpu()
    mul_process_io()
    mul_thread_cpu()
    mul_thread_io()

main()
            
          

執(zhí)行結(jié)果:

            
              [root@A02-R05-I18-13-A003335 data]# python3 test.py 
單進(jìn)程CPU密集型耗時(shí): 7.388684272766113
單進(jìn)程IO密集型耗時(shí): 25.975133419036865
多進(jìn)程CPU密集型耗時(shí): 0.006726264953613281
多進(jìn)程IO密集型耗時(shí): 2.7583560943603516
多線程CPU密集型耗時(shí): 7.976577043533325
多線程IO密集型耗時(shí): 47.74693512916565
            
          

執(zhí)行結(jié)果可以看出,Python中,多進(jìn)程在高CPU和高IO情況下均是最優(yōu),其次是單進(jìn)程但線程;多線程性能最差

?

設(shè)計(jì)模式
代表了一種最佳時(shí)間,是被開(kāi)發(fā) 人員長(zhǎng)期總結(jié)用來(lái)解決某一勞累問(wèn)題的思路方法,這些方法保證了代碼的效率也易于理解
邏輯編碼模型

總結(jié):
1, 進(jìn)程和線程的區(qū)別和聯(lián)系
2, 同步互斥的意義和實(shí)現(xiàn)方法
3, 進(jìn)程線程使用什么方式通信
4,進(jìn)程線程的特點(diǎn)和選擇
5, 簡(jiǎn)單的設(shè)計(jì)模式和理解
6, 將是京城,進(jìn)程狀態(tài),GIL等概念的理解


?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!?。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論