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

Python多線程及其基本使用方法實(shí)例分析

 更新時(shí)間:2019年10月29日 10:36:22   作者:peersli  
這篇文章主要介紹了Python多線程及其基本使用方法,結(jié)合實(shí)例形式分析了Python相關(guān)概念、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python多線程及其基本使用方法。分享給大家供大家參考,具體如下:

學(xué)習(xí)Python的多線程(Multi-threading),至少應(yīng)該要有進(jìn)程與線程的基本概念,可以參考:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html。

1.Python中的多線程

執(zhí)行一個(gè)程序,即在操作系統(tǒng)中開啟了一個(gè)進(jìn)程,在某一時(shí)刻,一個(gè)CPU內(nèi)核只能進(jìn)行一個(gè)進(jìn)程的任務(wù),現(xiàn)在的計(jì)算機(jī)所說的多進(jìn)程/多任務(wù)其實(shí)是通過加快CPU的執(zhí)行速度來實(shí)現(xiàn)的,因?yàn)橐粋€(gè)CPU每秒能執(zhí)行上億次的計(jì)算,能夠?qū)M(jìn)程進(jìn)行很多次切換,所以在人為可以感知的時(shí)間里,看上去,計(jì)算機(jī)確實(shí)是在同時(shí)執(zhí)行多個(gè)程序,即同時(shí)處理多個(gè)進(jìn)程。
一個(gè)進(jìn)程中可以包含有多個(gè)線程,這多個(gè)線程為實(shí)現(xiàn)該進(jìn)程的某個(gè)主要功能而運(yùn)行著,多個(gè)線程可以進(jìn)行串行工作,也可以并發(fā)同時(shí)進(jìn)行工作,顯然后者可以節(jié)省更多的時(shí)間。

在Python中是支持多線程并發(fā)執(zhí)行的,只是Python中的多線程只能利用單核,也就是說Python中的某一個(gè)進(jìn)程的多個(gè)線程只能在一個(gè)CPU核心上運(yùn)行,而不能分配在多個(gè)CPU核心中運(yùn)行,這是考慮到線程安全的緣故,而Python中的GIL則保證了線程安全。關(guān)于Python中的GIL,可以參考下面一篇文章:《淺析Python的GIL和線程安全》。

下面是自己在學(xué)習(xí)過程中的一些課堂筆記,因?yàn)檫€沒有真正學(xué)習(xí)一些理論,所以可能會(huì)有些錯(cuò)誤,但目前是方便自己的理解:

即GLI是以CPU核心為單位來控制全局鎖,所以是不能跨不同的CPU(核心 )的GLI可以保證同一個(gè)進(jìn)程中,某一個(gè)線程的共享數(shù)據(jù)在某一時(shí)刻只能同時(shí)被另外一個(gè)線程修改(使用),而不能同時(shí)被多個(gè)線程修改(使用),如果去掉GLI,則需要自己為線程加鎖,這樣之后,性能比原來還要差。

當(dāng)然,難道就不能充分利用多核CPU或多個(gè)CPU了?

做成多進(jìn)程就可以了,不同的進(jìn)程運(yùn)行在不同的CPU(核心)上,也可以實(shí)現(xiàn)并發(fā),只是這樣的話就會(huì)比較浪費(fèi)內(nèi)存空間,考慮同時(shí)運(yùn)行10個(gè)QQ程序的情況,假如1個(gè)QQ占用500M的內(nèi)存空間,則10個(gè)QQ就要占用5G的內(nèi)存空間了。但如果是多線程的話,可能10個(gè)QQ還是共享著這500M的內(nèi)存空間。還有一個(gè)缺點(diǎn)就是,多進(jìn)程間的數(shù)據(jù)直接訪問可能會(huì)比較麻煩,但其實(shí)也是可以實(shí)現(xiàn)的,比如chrome瀏覽器就是用多進(jìn)程實(shí)現(xiàn)的。

目前首先要明確的是,Python中是不能把一個(gè)進(jìn)程的多個(gè)線程分布在不同的CPU核心上運(yùn)行的。

2.Python多線程使用方法1

給出下面的程序代碼及注釋:

import threading  #Python多線程模塊
import time
def run(num):
  print 'Hi, I am thread %s..lalala' % num
  time.sleep(1)
for i in range(20):
  t = threading.Thread(target=run, args=(i,))  #多線程使用方法,target為需要執(zhí)行多線程的函數(shù),args為函數(shù)中的參數(shù),注意這里的參數(shù)寫成(i,),即如果只能一個(gè)參數(shù),也要加上一個(gè)","
  t.start()  #開始執(zhí)行多線程

程序運(yùn)行結(jié)果如下:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python thread4.py
Hi, I am thread 0..lalala
Hi, I am thread 1..lalala
Hi, I am thread 2..lalala
Hi, I am thread 3..lalala
Hi, I am thread 4..lalala
Hi, I am thread 5..lalala
Hi, I am thread 6..lalala
Hi, I am thread 7..lalala
Hi, I am thread 8..lalala
Hi, I am thread 9..lalala
Hi, I am thread 10..lalala
Hi, I am thread 11..lalala
Hi, I am thread 12..lalala
Hi, I am thread 13..lalala
Hi, I am thread 14..lalala
Hi, I am thread 15..lalala
Hi, I am thread 16..lalala
Hi, I am thread 17..lalala
Hi, I am thread 18..lalala
Hi, I am thread 19..lalala

直接看執(zhí)行結(jié)果是看不出什么的,這里說一下這個(gè)程序的執(zhí)行過程:0到19是同時(shí)打印輸入的,在打印19后,程序sleep 1秒后才結(jié)束程序的運(yùn)行。

上面這個(gè)程序有20個(gè)線程執(zhí)行,每個(gè)線程都是:打印字符串+sleep(1)。我們實(shí)際看到的結(jié)果是0到19同時(shí)打印,然后才sleep 1秒,但是需要注意的是,并非是20個(gè)線程才執(zhí)行一次sleep(1),而是在每個(gè)線程中都執(zhí)行了一次sleep(1),即該程序?qū)嶋H上是執(zhí)行了20次sleep(1),而我們實(shí)際看到的結(jié)果是程序運(yùn)行時(shí)僅僅是暫停了1秒,那是因?yàn)檫@20次sleep(1)是并發(fā)執(zhí)行的。

上面的程序可以這么去理解:20個(gè)線程相當(dāng)于有20匹馬,20匹馬同時(shí)起跑(打印字符串),然后以同時(shí)停1秒(sleep(1)),最后同時(shí)到達(dá)終點(diǎn)(20個(gè)線程運(yùn)行結(jié)束,即程序執(zhí)行結(jié)束)。

為了更好的理解上面的程序,可以把上面的代碼改為如下:

import threading
import time
def run(num):
  print 'Hi, I am thread %s..lalala' % num
  time.sleep(1)
for i in range(20):
  t = threading.Thread(target=run, args=(i,))
  t.start()
  t.join()  #等上一個(gè)線程執(zhí)行完后再執(zhí)行下一個(gè)線程

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

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python thread4.py
Hi, I am thread 0..lalala
Hi, I am thread 1..lalala
Hi, I am thread 2..lalala
Hi, I am thread 3..lalala
Hi, I am thread 4..lalala
Hi, I am thread 5..lalala
Hi, I am thread 6..lalala
Hi, I am thread 7..lalala
Hi, I am thread 8..lalala
Hi, I am thread 9..lalala
Hi, I am thread 10..lalala
Hi, I am thread 11..lalala
Hi, I am thread 12..lalala
Hi, I am thread 13..lalala
Hi, I am thread 14..lalala
Hi, I am thread 15..lalala
Hi, I am thread 16..lalala
Hi, I am thread 17..lalala
Hi, I am thread 18..lalala
Hi, I am thread 19..lalala

執(zhí)行結(jié)果看上去跟前面是一樣的,但執(zhí)行過程卻是這樣的:每打印一次字符串,再暫停一秒。

通過這個(gè)程序,也就可以更好的理解Python的多線程并發(fā)執(zhí)行了,當(dāng)然,因?yàn)檫@是一個(gè)動(dòng)態(tài)的過程,所以把程序執(zhí)行一遍后會(huì)有更好的理解。

3.Python多線程使用方法2

程序代碼如下:

import threading,time
class MyThread(threading.Thread):
  def __init__(self, num):
    threading.Thread.__init__(self)
    self.num = num
  def run(self): #this name must be 'run'
    print 'I am thread %s' % self.num
    time.sleep(2)
for i in range(20):
  t = MyThread(i)
  t.start()

程序的執(zhí)行結(jié)果與方法1是一樣的,這里就不給出了,只是這里利用了面向?qū)ο缶幊痰乃枷敕椒▉碓O(shè)計(jì)程序代碼。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計(jì)入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • pycharm顯示遠(yuǎn)程圖片的實(shí)現(xiàn)

    pycharm顯示遠(yuǎn)程圖片的實(shí)現(xiàn)

    這篇文章主要介紹了pycharm顯示遠(yuǎn)程圖片的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python 用正則表達(dá)式篩選文本信息的實(shí)例

    python 用正則表達(dá)式篩選文本信息的實(shí)例

    今天小編就為大家分享一篇python 用正則表達(dá)式篩選文本信息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實(shí)操案例練習(xí)(八)

    python實(shí)操案例練習(xí)(八)

    這篇文章主要介紹了python實(shí)操案例練習(xí),本篇文章主要分享的案例內(nèi)容有記錄用戶登錄日志、模擬淘寶客服自動(dòng)回復(fù),下面詳細(xì)的內(nèi)容,需要的小伙伴可以參考一下。希望對(duì)你有所幫助
    2022-02-02
  • Python?Pygame實(shí)戰(zhàn)之打磚塊小游戲

    Python?Pygame實(shí)戰(zhàn)之打磚塊小游戲

    打磚塊最早是由雅達(dá)利公司開發(fā)的一款獨(dú)立游戲,也是無數(shù)人的童年記憶。本文將利用Python中的Pygame模塊制作經(jīng)典的打磚塊游戲,需要的可以參考一下
    2022-02-02
  • Python必備技巧之集合Set的使用

    Python必備技巧之集合Set的使用

    在數(shù)學(xué)中,對(duì)集合的嚴(yán)格定義可能是抽象的且難以掌握。但實(shí)際上可以將集合簡單地認(rèn)為是定義明確的不同對(duì)象的集合,通常稱為元素或成員。Python 提供了一個(gè)內(nèi)置的集合類型來將對(duì)象分組到一個(gè)集合中,快跟隨小編一起學(xué)習(xí)一下吧
    2022-03-03
  • Python中弱引用的神奇用法與原理詳解

    Python中弱引用的神奇用法與原理詳解

    弱引用在很多語言中都存在,最常用來解決循環(huán)引用問題,下面這篇文章主要給大家介紹了關(guān)于Python中弱引用的神奇用法與原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Python使用QQ郵箱發(fā)送Email的方法實(shí)例

    Python使用QQ郵箱發(fā)送Email的方法實(shí)例

    實(shí)際開發(fā)過程中使用到郵箱的概率很高,那么如何借助python使用qq郵箱發(fā)送郵件呢?正好最近工作遇到這個(gè)需求,所以想著把方法分享出來方便大家,所以這篇文章主要介紹了Python使用QQ郵箱發(fā)送Email的實(shí)現(xiàn)方法,需要的朋友可以參考。
    2017-02-02
  • 學(xué)習(xí)win32com操作word之Range精講

    學(xué)習(xí)win32com操作word之Range精講

    這篇文章主要為大家介紹了win32com操作word之Range精講學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • python3第三方爬蟲庫BeautifulSoup4安裝教程

    python3第三方爬蟲庫BeautifulSoup4安裝教程

    這篇文章主要為大家詳細(xì)介紹了python3第三方爬蟲庫BeautifulSoup4的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 利用Python正則表達(dá)式過濾敏感詞的方法

    利用Python正則表達(dá)式過濾敏感詞的方法

    今天小編就為大家分享一篇利用Python正則表達(dá)式過濾敏感詞的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評(píng)論

邻水| 醴陵市| 苏尼特右旗| 陆良县| 中江县| 正宁县| 孟州市| 双流县| 汕尾市| 津南区| 泰顺县| 封开县| 东安县| 丹巴县| 高台县| 望谟县| 峡江县| 永登县| 岳普湖县| 永德县| 西藏| 宜黄县| 随州市| 高雄县| 贵德县| 屯昌县| 濉溪县| 太湖县| 永德县| 肥乡县| 旬邑县| 景宁| 兴宁市| 和平区| 包头市| 瑞金市| 九寨沟县| 平乐县| 苏尼特左旗| 大安市| 东源县|