Python並發編程很簡單,一文搞清如何使用構造器創建線程

2020-12-11 品位集結號

上次已經和大家探討了關於進程和線程的區別和聯繫相關的東東,今天呢,咱們再次回到Python哦,和大家一起聊聊如何進行Python並發編程哦,大家也可以理解為如何在Python中進行多線程編程哦!

好啦,廢話少說,咱們就開始吧!

首先說一下哦,Python內部是提供了兩個模塊來支持多線程編程的,它們分別是_thread和threading哦,到這可能有朋友會問了,這兩個有什麼區別呢?好問題哦,其實呢,_thread是提供低級別而且是比較原始的線程支持的哦,而且呢它還有一個簡單的鎖,通過以前咱們的講解大家對於_thread前面的下劃線的意思已經明白啦,它是代表隱藏的含義哦,這也表明了其實Python是不建議咱們使用這個_thread的;因此呢,如果你在Python中想進行多線程編程,那就好好使用threading模塊吧,因為在threading中提供了功能超級豐富的對多線程編程的支持哦

其實,對於Python創建線程的方式主要有兩種哦,今天呢,咱們就先介紹一下第一種吧,第二種方式咱們下次介紹哦,那第一種方式是什麼呢?它就是使用threading模塊的Thread類的構造方法(也可以叫構造器哦)創建線程哦!

那如何使用threading模塊的Thread類的構造器創建線程呢?不要著急哦,要想知道怎麼創建,首先咱們需要了解一下threading模塊中Thread類的構造器的語法結構哦:

__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)

首先說一下哦,上面Thread類的這個構造器中的很多參數是自身賦值None,說明它是默認參數哦,對於這類參數可以不做任何賦值就會有None這個默認值哦,好啦,咱們就說一下__init__()中各個參數的含義吧:

第一個參數self,這個大家都熟悉啦,在Python的類中每個方法的首個參數必須是self哦;

第二個參數group,表示該線程所屬的線程組哦,據說這個參數是保留使用的,還沒有具體的實際實現意義哦;

第三個參數target,表示該線程要調度的目標方法哦;

第四個參數name表示線程名哦;

第五個參數args,通過它的賦值可以看出它是一個元組哦,表示以位置參數的形式為target指定的函數傳入參數哦;

第六個參數kwargs,代表一個字典哦,表示你可以以關鍵字參數的形式為target指定的函數傳入參數哦;

第七個參數daemon,代表指定所構建的線程是否是後臺線程哦。

到這大家是否對於Thread類的構造器__init__()有點晦澀難懂呢,沒關係哦,下面咱們舉個「慄子」就清楚啦,舉「慄子」之前咱們先說一下使用Tread類的狗仔妻創建多線程的步驟哦:

第一步呢,就是調用Tread類的構造器創建線程對象哦,在創建線程對象時,target參數指定的函數將會作為線程的執行體哦;

第二步呢,就是調用線程對象的start()函數啟動這個線程哦。

好啦,下面咱們正式舉「慄」哦:

上面就是咱們所編寫的程序哦,可以看到哦,在主函數中咱們定義了一個循環哦,在這個循環中咱們設定當循環變量i等於10時就會創建並啟動兩個咱們定義的新的線程哦,其中第16行和第19行就是咱們所創建的兩個線程哦,對於兩個線程的運行都是調用start()函數哦!

下面咱們就運行一下上面咱們所編寫的這個程序來看看效果吧:

上面就是多線程的運行結果哦,咱們用不同的顏色進行了標記哦,看一看到主線程和咱們所創建並運行的兩個線程都進行了無規律的交叉運行哦,這就表明咱們使用Python進行多線程編程成功了哦,這就是經典的並發編程哦,其實呢,是因為咱們電腦的CPU以極快的速度在這幾個線程之間進行切換執行的,由於電腦主頻很高哦,所以呢,咱們就感覺是電腦進行了並發編程的哦!

好啦,上面就是咱們所聊的關於使用threading模塊的Thread類的構造器__init__()創建線程的東東哦,關於Python創建線程的第二種方法(使用繼承threading模塊的Thread類創建線程類)咱們下次進行介紹哦,今天咱們就聊到這吧,下次再見哦!

敬請關注「品位集結號」,為您帶來意外的小收穫!

相關焦點

  • Python並發編程很簡單,一文幫你搞清如何創建線程類
    對於Python的並發編程相關的東東,相信通過上次咱們的探討,大家已經比較清楚了,對於Python創建線程的方式主要有兩種,這個上次咱們也已經說過了哦,第一種是使用threading模塊的Thread類的構造器來創建線程,這種方式上次咱們已經詳細討論過了哦,這次呢,咱們就重點和大家來聊聊第二種方式吧
  • Python並發編程初步
    另一個方面是採用並發方式執行,重複利用多核CPU優勢加速執行。關於並發編程大家可能比較熟悉的是Golang的協程、通道和Node.js 的async.parallel異步並發編程。就並發編程來說,Python不是一門合適的語言,主要是Python有一個解析器(CPython)內置的全局解釋鎖GIL。
  • Python並發編程你真的會嗎?一文搞清後臺線程和線程睡眠
    關於Python多線程編程的內容,上次已經和大家共同探討了線程的join()方法,它可以讓一個線程等待另一個線程完成,即某個程序執行流中如果調用其他線程的join()方法時,調用線程將會被阻塞,一直等到被join()方法加入的join線程執行完成為止。
  • 揭秘Python並發編程——協程
    Python並發編程一直是進階當中不可跨越的一道坎,其中包括進程、線程、協程,今天我們就來聊一聊協程。協程的定義很簡單,從頭到尾只有一條任務線在進行,就像是你可以在煮雞蛋的時候背單詞,但無論是煮雞蛋還是背單詞,始終都是你一個人在進行任務,線程的概念稍有不同,是把一個人分成兩個人,一個在煮雞蛋,一個在背單詞,我們直接上代碼看一下:這是一段普通的代碼,我們分別讓不同的url睡眠不同的時間,總共是10s,看一下運行結果:然後,我們使用協程來執行這段代碼:
  • 多任務並發編程需要學習的內容有哪些?
    Python多任務並發編程需要學習的內容有哪些?並發編程的目的是為了讓程序運行得更快,分工,高效地拆解任務並分配給線程;同步,線程之間如何協作; 互斥,保證同一時刻只允許一個線程訪問共享資源。需要學習多線程、多進程的創建,互斥鎖,死鎖,集全局變量等問題的解決方案。
  • Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信
    在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。
  • JAVA並發編程:線程並發工具類Callable、Future 和FutureTask的使用
    由於Future 只是一個接口,無法直接用來創建對象使用,因此就有了下面的FutureTask。FutureTask 類實現了RunnableFuture 接口,RunnableFuture 繼承了Runnable接口和Future 接口,而FutureTask 實現了RunnableFuture 接口。
  • Python多線程實戰
    點擊上方「Python人工智慧編程」,馬上關注目的:(1)了解python線程執行原理(2)掌握多線程編程與線程同步(3)了解線程池的使用1 線程基本概念1.1 線程是什麼?線程是指進程內的一個執行單元,也是進程內的可調度實體.
  • Python 3.8異步並發編程
    有效的提高程序執行效率的兩種方法是異步和並發,Golang,node.js之所以可以有很高執行效率主要是他們的協程和異步並發機制。實際上異步和並發是每一種現代語言都在追求的特性,當然Python也不例外,今天我們就講講Python 3中的異步並發編程。
  • Java 並發編程之美-線程相關的基礎知識
    借用 Java 並發編程實踐中的話:編寫正確的程序並不容易,而編寫正常的並發程序就更難了;相比於順序執行的情況,多線程的線程安全問題是微妙而且出乎意料的
  • 如何利用並發性加速你的python程序(一):相關概念
    Jim 有多年的編程經驗,並且使用過各種程式語言。他曾做過嵌入式系統相關的工作,開發過分布式系統,並且參加過許多會議。如果你聽過很多關於 asyncio 被添加到 python 的討論,但是好奇它與其他並發方法相比怎麼樣,或者你很好奇什麼是並發,以及它如何加速你的程序,那麼你需要看下 Jim Anderson 的這篇文章,雷鋒網編譯整理。
  • Python 多線程入門,這一篇文章就夠了
    Python 實現多線程有兩種方式:使用 threading 模塊的 Thread 類的構造器創建線程繼承 threading 模塊的 Thread 類創造線程類看到這,你是不是發現這和 Java 實現多線程的方式很相類,不錯,確實就是這樣,所以再次印證了那句話,只要學好了一門語言,學習其他語言都會起到事半功倍的效果
  • python核心編程之多線程教程-threading
    多線程-threadingpython的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些包裝的,可以更加方便的被使用1.使用threading模塊單線程執行#coding=utf-8import timedef saySorry():print("親愛的,我錯了,我能吃飯了嗎?")
  • Python並發編程之線程中的信息隔離
    昨天我們說,線程與線程之間要通過消息通信來控制程序的執行。講完了消息通信,今天就來探討下線程裡的 信息隔離是如何做到的。大家注意:信息隔離,這並不是官方命名的名詞,也不是網上廣為流傳的名詞。是我為了方便理解而自創的,大家知道就好咯。本文目錄初步認識信息隔離信息隔離的意義何在. 初步認識信息隔離什麼是 信息隔離?
  • Java並發編程:多線程如何實現阻塞與喚醒
    線程的阻塞和喚醒在多線程並發過程中是一個關鍵點,當線程數量達到很大的數量級時,並發可能帶來很多隱蔽的問題。如何正確暫停一個線程,暫停後又如何在一個要求的時間點恢復,這些都需要仔細考慮的細節。
  • Java多線程並發工具類-信號量Semaphore對象講解
    Java多線程並發工具類-Semaphore對象講解通過前面的學習,我們已經知道了Java多線程並發場景中使用比較多的兩個工具類:做加法的CycliBarrier對象以及做減法的CountDownLatch對象並對這兩個對象進行了比較。我們發現這兩個對象要麼是做加法,要麼是做減法的。那麼有沒有既做加法也做減法的呢?
  • Alibaba架構師從零開始,一步一步帶你進入並發編程的世界
    線程池的拒絕策略進行了實驗,通過使用線程池能最大幅度地減少創建線程對象的內存與CPU開銷,加快程序運行效率,也對創建線程類的代碼進行了封裝,方便開發並發類型的軟體項目。本書並不是簡單地羅列出並發API和機制,相反,它提供了設計規則、模式和理想模型,使讀者能夠更容易地構建出既正確又高效的並發程序來。
  • 尹立博:Python 全局解釋器鎖與並發 | AI 研習社第 59 期猿桌會
    我會先介紹一下全局解釋器鎖 (GIL))的概念和影響;接下來會藉助幾個案例分析來展示 Python 通過多進程、多線程和異步、分布式計算來達成並發的幾種方式;最後會介紹一套分布式計算工具——Dask。全局解釋器鎖 (GIL)GIL 的概念用簡單的一句話來解釋,就是「任一時刻,無論線程多少,單一 CPython 解釋器只能執行一條字節碼」。
  • python編程入門,零基礎學習Python基礎教程
    這裡推薦這門python編程入門基礎教程,適合零基礎的同學學習!python軟體工程師都學什麼?自學Python,看視頻學的更快、更透徹一些,給你個課程大綱!第十一章:講解Python中進程和線程的概念。主要的內容包括進程和線程的創建及管理。重點講解了多線程環境下數據同步。第十二章:講解Python中和網絡編程相關的內容,包括使用TCP/UDP協議實現伺服器端和客戶端的通信。第十三章:講解Python自帶的GUI開發庫Tkinter的基本組件及其使用方法,並給出每種組件的詳細示例代碼。
  • Java多線程並發編程中並發容器第二篇之List的並發類講解
    Java多線程並發編程中並發容器第二篇之List的並發類講解概述本文我們將詳細講解list對應的並發容器以及用代碼來測試ArrayList、vector以及CopyOnWriteArrayList在100個線程向list中添加1000個數據後的比較