最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程即相關(guān)理念詳解

 更新時(shí)間:2021年11月29日 15:50:36   作者:團(tuán)子的守護(hù)  
這篇文章主要為大家介紹了Python多線程即相關(guān)理念,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、什么是線程?

線程顧名思義,就是一條流水線工作的過(guò)程,一條流水線必須屬于一個(gè)車(chē)間,一個(gè)車(chē)間的工作過(guò)程是一個(gè)進(jìn)程。車(chē)間負(fù)責(zé)把資源整合到一起,是一個(gè)資源單位,而一個(gè)車(chē)間內(nèi)至少有一個(gè)流水線。所以,進(jìn)程只是用來(lái)把資源集中到一起(進(jìn)程只是一個(gè)資源單位,或者說(shuō)資源集合),而線程才是cpu上的執(zhí)行單位。

總結(jié)進(jìn)程與線程區(qū)別:

'''
進(jìn)程:資源單位
線程:執(zhí)行單位
線程才是真正干活的人,干活中需要的資源由線程所在進(jìn)程提供
每個(gè)進(jìn)程肯定自帶一個(gè)線程
每個(gè)進(jìn)程內(nèi)可創(chuàng)建多個(gè)線程
'''
'''
開(kāi)進(jìn)程:
    申請(qǐng)空間
    拷貝代碼
    消耗資源大
開(kāi)線程:
    同一個(gè)進(jìn)程內(nèi)創(chuàng)建多個(gè)線程,無(wú)需上述兩種操作,消耗資源相對(duì)較小
'''

多線程(即多個(gè)控制線程)的概念是,在一個(gè)進(jìn)程中存在多個(gè)控制線程,多個(gè)控制線程共享該進(jìn)程的地址空間,相當(dāng)于一個(gè)車(chē)間內(nèi)有多條流水線,都共用一個(gè)車(chē)間的資源。

二、開(kāi)啟線程的兩種方式

1、方式1

from threading import Thread
import time
# 方法一
def task(name):
    print('%s is running' % name)
    time.sleep(1)
    print('%s is over' % name)
# 開(kāi)啟線程不需要在main下面執(zhí)行代碼,直接書(shū)寫(xiě)就可以
# 但是習(xí)慣性的將啟動(dòng)命令寫(xiě)在main下面
t = Thread(target=task, args=('egon',))
t.start()  # 創(chuàng)建線程的開(kāi)銷(xiāo)非常小,幾乎是代碼一執(zhí)行就已經(jīng)創(chuàng)建了
print('主')
'''

運(yùn)行結(jié)果:
egon is running

egon is over
'''

2、方式2

from threading import Thread
class MyThread(Thread):
    def __init__(self, name):
        # 重寫(xiě)了別人的方法,又不知道別人的方法里有啥,就調(diào)用父類(lèi)的方法
        super().__init__()
        self.name = name
    def run(self):
        print('%s is running' % self.name)
        time.sleep(1)
        print('%s is over' % self.name)
if __name__ == '__main__':
    t = MyThread('egon')
    t.start()
    print('主')
'''

運(yùn)行結(jié)果:
egon is running

egon is over
'''

三、線程對(duì)象的jion方法()

看過(guò)我講解進(jìn)程文章的小伙伴想必都知道jion的功能,線程的jion方法于進(jìn)程的jion方法功能類(lèi)似-等待一個(gè)線程執(zhí)行完畢后再執(zhí)行下一個(gè)線程

from threading import Thread
def task(name):
    print('%s is running' % name)
    time.sleep(1)
    print('%s is over' % name)
if __name__ == '__main__':
    t=Thread(target=task,args=('egon',))
    t.start()
    t.join()# 主線程等待子線程運(yùn)行結(jié)束后再執(zhí)行
    print('主')

?'''
運(yùn)行結(jié)果:
egon is running
egon is over

'''

補(bǔ)充一個(gè)知識(shí)點(diǎn):同一個(gè)進(jìn)程下的多個(gè)線程數(shù)據(jù)共享,下面為大家舉一個(gè)簡(jiǎn)單的案例

from threading import Thread
money=100
def task():
    global money
    money=66
if __name__ == '__main__':
    t=Thread(target=task,args=())
    t.start()
    print(money)

# 結(jié)果:66

四、 補(bǔ)充小案例

from threading import Thread
import os,time
def task():
    print('子 pid:',os.getpid())
if __name__ == '__main__':
    t=Thread(target=task,args=())
    t.start()
    print('主 pid:',os.getpid())
    # 兩個(gè)線程的pid號(hào)一樣,說(shuō)明在同一個(gè)進(jìn)程下

'''
運(yùn)行結(jié)果:
子 pid: 13444
主 pid: 13444
'''

# 這是個(gè)容易混淆的案例
from threading import Thread,current_thread,active_count
import os,time
def task(n):
    print('子',current_thread().name)
    time.sleep(n) # 延長(zhǎng)線程存活時(shí)間
if __name__ == '__main__':
    t=Thread(target=task,args=(1,))
    t1=Thread(target=task,args=(1,))
    t.start()
    t1.start()
    t.join()
    # print('主',current_thread().name)# 獲取線程名字
    print(active_count()) # 統(tǒng)計(jì)當(dāng)前活躍的進(jìn)程數(shù)

'''
運(yùn)行結(jié)果:
子 Thread-1
子 Thread-2
1
'''
# 這里大家容易以為是3,其實(shí)運(yùn)行后只有一個(gè)線程在活躍了,其它兩個(gè)線程運(yùn)行完后就停止運(yùn)行了

五、守護(hù)線程

守護(hù)線程與守護(hù)進(jìn)程的概念也類(lèi)似,其實(shí)大家也能注意到,進(jìn)程與線程有許多知識(shí)點(diǎn)即用法都是相通的,理解了一個(gè)另一個(gè)也是差不多的道理

1、守護(hù)線程會(huì)隨著主線程的結(jié)束而結(jié)束

2、主線程運(yùn)行結(jié)束后不會(huì)立刻結(jié)束,會(huì)等待所有的其它非守護(hù)線程結(jié)束后才會(huì)結(jié)束

3、因?yàn)橹骶€程的結(jié)束意味著所在進(jìn)程的結(jié)束

from threading import Thread
import time
def task(name):
    print('%s is running'%name)
    time.sleep(1)
    print('%s is over'%name)
if __name__ == '__main__':
    t=Thread(target=task,args=('egon',))
    t.daemon=True #將t設(shè)置為守護(hù)線程
    t.start()
    print('主')

'''
運(yùn)行結(jié)果:
egon is running

'''

# 稍微有點(diǎn)迷惑性的例子
from threading import Thread
import time
def foo():
    print('1234')
    time.sleep(1)
    print('end1234')
def func():
    print('5678')
    time.sleep(3)
    print('end5678')
if __name__ == '__main__':
    t1=Thread(target=foo,args=())
    t2=Thread(target=func,args=())
    t1.daemon=True # t1設(shè)為守護(hù)線程,t2為非守護(hù)線程
    t1.start()
    t2.start()
    print('主......')

'''
運(yùn)行結(jié)果:
1234
5678主......
end1234
end5678
'''

'''
因主線程會(huì)等待非守護(hù)線程運(yùn)行結(jié)束后在結(jié)束,
所有主線程會(huì)等待t2(非守護(hù)線程)結(jié)束再結(jié)束,
'''

六、線程互斥鎖

多個(gè)線程操作同一份數(shù)據(jù)的時(shí)候,會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂的問(wèn)題

針對(duì)上述問(wèn)題,解決方式就是加鎖處理

from threading import  Thread,Lock
import time
money=100
mutex=Lock()
def task():
    global money
    mutex.acquire()
    tmp=money
    time.sleep(0.1)# 模擬網(wǎng)絡(luò)延遲
    money=tmp-1
    mutex.release()
if __name__ == '__main__':
    t_list=[]
    for i in range(100):
        t=Thread(target=task,args=())
        t.start()
        t_list.append(t)
    for t in t_list:
        t.join()
    print(money)

# 運(yùn)行結(jié)果:0
# 多個(gè)人操作同一份數(shù)據(jù),數(shù)據(jù)錯(cuò)亂,加鎖處理

七、GTL-全局解釋器

相信學(xué)python的小伙伴都知道,python解釋器其實(shí)有多個(gè)版本

  • Cpython
  • Jpython
  • Pypython

但是普遍使用的都是Cpython解釋器

在Cpython解釋器中GIL是一把互斥鎖,用來(lái)阻止同一個(gè)進(jìn)程下的多個(gè)線程的同時(shí)執(zhí)行

要注意同一進(jìn)程下的多個(gè)線程無(wú)法利用多核優(yōu)勢(shì)?。。?!

想必大家心中也有不少疑惑:pyhon的多線程是不是一點(diǎn)用都沒(méi)了呢????

因?yàn)镃python中的內(nèi)存管理不是線程安全的。多線程并不是一無(wú)是處的,在遇到多IO操作的時(shí)候,多核的優(yōu)勢(shì)也會(huì)顯示不出來(lái),多進(jìn)程與多線程的效率在該情況下差不了多少,而此時(shí)多進(jìn)程相對(duì)浪費(fèi)資源,多線程更加節(jié)省資源

ps:內(nèi)存管理就是垃圾回收機(jī)制:

1、引用計(jì)數(shù)

2、標(biāo)記清除

3、分帶回收

# GTL-全局解釋器
# 重點(diǎn):1、GIL不是python的特點(diǎn)而是Cpython解釋器的特點(diǎn)
#      2、GIL是保證解釋器級(jí)別的數(shù)據(jù)的安全
#      3、GIL會(huì)導(dǎo)致同一個(gè)進(jìn)程下的多個(gè)線程無(wú)法同時(shí)進(jìn)行(即無(wú)法利用多核優(yōu)勢(shì))
#      4、針對(duì)不同的數(shù)據(jù)還是需要加不同的鎖處理
#      5、解釋型語(yǔ)言的通病,同一個(gè)進(jìn)程下多個(gè)線程無(wú)法利用多核優(yōu)勢(shì)

多線程是否有用要看具體情況

八、驗(yàn)證多線程與多線程運(yùn)用場(chǎng)景

# 計(jì)算密集型(CPU一直工作,也沒(méi)有IO)(更適合多進(jìn)程)
from multiprocessing import Process
from threading import Thread
import os,time
# 多進(jìn)程情況
def work():
    res=0
    for i in range(0,10000000):
        res*=i
if __name__ == '__main__':
    l=[]
    print(os.cpu_count())# 獲取當(dāng)前計(jì)算機(jī)CPU核數(shù)
    start_time=time.time()
    for i in range(8):# 我計(jì)算機(jī)是8核
        p= Process(target=work,args=())
        p.start()
        l.append(p)
    for p in l:
        p.join()
    print(time.time()-start_time)

'''
運(yùn)行結(jié)果:
8
2.0726492404937744
'''

# 多線程情況
from multiprocessing import Process
from threading import Thread
import os,time
def work():
    res=0
    for i in range(0,10000000):
        res*=i
if __name__ == '__main__':
    l=[]
    print(os.cpu_count())# 獲取當(dāng)前計(jì)算機(jī)CPU核數(shù)
    start_time=time.time()
    for i in range(8):# 我計(jì)算機(jī)是8核
        t=Thread(target=work,args=())
        t.start()
        l.append(t)
    for p in l:
        p.join()
    print(time.time()-start_time)

'''
運(yùn)行結(jié)果:
8
3.5790603160858154
'''

# 顯然可知:計(jì)算密集型更時(shí)候多進(jìn)程

# IO密集型(任務(wù)一直有IO)(多線程更合適)
from multiprocessing import Process
from threading import Thread
import os,time
# 多線程
def work():
    time.sleep(1)
if __name__ == '__main__':
    l=[]
    start_time=time.time()
    for i in range(40):
        t=Thread(target=work,args=())
        t.start()
        l.append(t)
    for p in l:
        p.join()
    print(time.time()-start_time)
# 運(yùn)行結(jié)果:1.0205152034759521
# 多進(jìn)程
from multiprocessing import Process
from threading import Thread
import os,time
def work():
    time.sleep(1)
if __name__ == '__main__':
    l=[]
    start_time=time.time()
    for i in range(40):
        p= Process(target=work,args=())
        # t=Thread(target=work,args=())
        # t.start()
        # l.append(t)
        p.start()
        l.append(p)
    for p in l:
        p.join()
    print(time.time()-start_time)

# 運(yùn)行結(jié)果:5.927189588546753

# 顯然可知:IO密集型更適合多線程

總結(jié):

多線程和多進(jìn)程都各自有各自的優(yōu)勢(shì)

并且在后面的項(xiàng)目中通??梢远噙M(jìn)程下面再開(kāi)設(shè)多線程

這樣的話我們可以利用多核也可以節(jié)省資源消耗

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python讀取指定目錄下指定后綴文件并保存為docx

    Python讀取指定目錄下指定后綴文件并保存為docx

    這篇文章主要介紹了Python讀取指定目錄下指定后綴文件并保存為docx,需要的朋友可以參考下
    2017-04-04
  • python快速建立超簡(jiǎn)單的web服務(wù)器的實(shí)現(xiàn)方法

    python快速建立超簡(jiǎn)單的web服務(wù)器的實(shí)現(xiàn)方法

    某些條件測(cè)試,需要一個(gè)簡(jiǎn)單的web服務(wù)器測(cè)試一下,為此專門(mén)去配置個(gè)nginx 或者 apache服務(wù)器略顯麻煩,這里就為大家介紹一下使用python快速建立超簡(jiǎn)單的web服務(wù)器的方法,需要的朋友可以參考下
    2018-02-02
  • Python 串口通信的實(shí)現(xiàn)

    Python 串口通信的實(shí)現(xiàn)

    這篇文章主要介紹了Python的串口通信的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • 探索Python元類(lèi)的魅力:靈活定制類(lèi)的創(chuàng)建過(guò)程

    探索Python元類(lèi)的魅力:靈活定制類(lèi)的創(chuàng)建過(guò)程

    在Python編程中,元類(lèi)(Metaclass)是一項(xiàng)高級(jí)特性,它允許我們?cè)诙x類(lèi)的時(shí)候動(dòng)態(tài)地控制類(lèi)的創(chuàng)建過(guò)程。元類(lèi)提供了一種強(qiáng)大的機(jī)制,可以對(duì)類(lèi)進(jìn)行定制化,擴(kuò)展其功能,并在類(lèi)的實(shí)例化過(guò)程中執(zhí)行額外的操作,本文將深入解析
    2023-10-10
  • python中函數(shù)返回多個(gè)結(jié)果的實(shí)例方法

    python中函數(shù)返回多個(gè)結(jié)果的實(shí)例方法

    在本篇文章里小編給大家整理了一篇關(guān)于python中函數(shù)返回多個(gè)結(jié)果的實(shí)例方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Selenium使用Chrome模擬手機(jī)瀏覽器方法解析

    Selenium使用Chrome模擬手機(jī)瀏覽器方法解析

    這篇文章主要介紹了Selenium使用Chrome模擬手機(jī)瀏覽器方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python基礎(chǔ)之Spyder的使用

    Python基礎(chǔ)之Spyder的使用

    Spyder是一個(gè)用于科學(xué)計(jì)算的使用Python編程語(yǔ)言的集成開(kāi)發(fā)環(huán)境(IDE),它結(jié)合了綜合開(kāi)發(fā)工具的高級(jí)編輯、分析、調(diào)試等功能,需要的朋友可以參考下
    2023-05-05
  • Python md5與sha1加密算法用法分析

    Python md5與sha1加密算法用法分析

    這篇文章主要介紹了Python md5與sha1加密算法,簡(jiǎn)單介紹了md5級(jí)sha1加密算法的概念、原理,并結(jié)合實(shí)例形式分析了Python使用hashlib模塊實(shí)現(xiàn)加密功能的具體操作技巧,需要的朋友可以參考下
    2017-07-07
  • 解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題

    解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題

    這篇文章主要介紹了如何解決Python 函數(shù)聲明先后順序的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)

    Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)

    這篇文章主要介紹了Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

玉环县| 奇台县| 丹江口市| 阿瓦提县| 沛县| 布尔津县| 剑阁县| 宣汉县| 永丰县| 马山县| 红安县| 湖口县| 辽阳市| 三台县| 耿马| 崇州市| 天门市| 南城县| 定陶县| 洛隆县| 哈尔滨市| 郯城县| 梁山县| 梅州市| 东平县| 志丹县| 米脂县| 合作市| 横山县| 金门县| 友谊县| 自贡市| 佛冈县| 藁城市| 德钦县| 长白| 义乌市| 开阳县| 康乐县| 广德县| 玉屏|