日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python多任务(2.线程的概念以及组成(创建线程的两种方式))

發布時間:2024/9/30 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python多任务(2.线程的概念以及组成(创建线程的两种方式)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.線程的概念

  • ? ? 線程是進程中執行代碼的一個分支,每個執行分支(線程)要想工作執行代碼需要CPU進行調度,也就是說線程是CPU調度的基本單位每個進程至少都有一個線程,而這個線程就是我們通常說的主線程。
  • 線程是一個獨立的執行流,系統中的多個線程可以并行及并發執行,多個線程可以共享數據與資源、利用了所謂的共享信息空間。
  • ? 一個線程主要由3個元素構成: 程序計數器、寄存器、與棧

2.Python中多線程? ----? threading模塊

? 1.導入線程模塊

import threading

? ?2.線程類Thread參數說明
? ? Thread(group,target,name,args,kwargs)

  • gourp:線程組,目前只能使用None
  • target:執行的目標任務名
  • args:以元組的方式給執行任務傳參
  • kwargs:以字典方式給執行任務傳參
  • name:線程名,一般不用設置

3.多線程的注意點

  • 當調用Thread的時候,不會創建線程
  • 調用Thread創建出來的實例對象的start方法的時候,才會創建線程以及讓這個線程開始運行線程真正創建是調用start(),線程真正結束是主線程結束
  • 主線程會等待所有的子線程結束后才結束
  • 線程創建后誰先執行是不確定的,要確定先后的順序可以通過延時的方式來保證只要主線程一死,其他的子線程就會全部結束

3.多線程的使用

下面看例子:

  • 首先看看不使用多線程,使用單線程所花費的時間
import timedef eat_fish():print("--正在吃魚--")time.sleep(1)if __name__ == '__main__':for i in range(5):eat_fish()''' 運行的結果, 一次只執行一次,5秒鐘執行完成 --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- '''
  • ??用threading創建多線程來執行任務

t =? threading.Thread(target=函數名)? ?# 生成一個子線程對象

t.start()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #? 然后利用這個對象調用start()方法,,來創建一個子線程

詳解:

? ?threading.Thread(

? ? ? group=None,name=None,args=(),kwargs={}

)

# 導入線程模塊 import threading import timedef eat_candy():print("--正在吃糖果--")time.sleep(1)if __name__ == '__main__':for i in range(5):t = threading.Thread(target=eat_candy) # 給target傳入函數的名字# 生成一個實例對象 t t.start() # 啟動線程,即讓線程開始執行''' 運行的結果, 一次就執行完成,花費1秒執行完成 5個線程 --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- --正在吃糖果-- '''

4.獲取線程(查看線程的名稱)

threading.current_thread()

5.查看線程數?

??threading.enumerate() # 返回值是一個列表,里面有當前執行的所有線程
  • 循環查看當前運行的線程
import threading import timedef test1():for i in range(3):print("----test1---%d---"%i)time.sleep(1)'''如果創建Thread時執行的函數,運行結束那么意味著 這個子線程就結束了'''def test2():for i in range(6):print("----test2---%d---"%i)time.sleep(1)def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()t2.start()while True:print(threading.enumerate()) # 打印出線程的列表'''所有的線程只剩一個的時候(即主線程)就退出'''if len(threading.enumerate())<=1:breaktime.sleep(1) if __name__ == '__main__':main()

?Thread執行的函數結束時,線程就結束了,所以打印線程的長度是就會少一個。

  • 在使用Thread時,線程是從什么時候開始創建的,什么時候結束
import threading import timedef test1():for i in range(5):print("----test1---%d---" % i)time.sleep(1)def main():# 在調用Thread之前先打印當前線程信息print(threading.enumerate())t1 = threading.Thread(target=test1)# 在調用Thread之后打印print(threading.enumerate())t1.start()# 在調用start()之后打印print(threading.enumerate())if __name__ == '__main__':main()

?結果:??

6. 通過繼承Thread類完成創建線程

  • 適合一個線程里面做的事情比較復雜,而且分了多個函數來做,一般來封裝成一個類,類里面覆寫run()方法用這個類的實例對象來調用start()方法
  • 如果類里面還有其他的方法想要用子線程,直接在run()方法里面調用就行(例如:self.login())?如果直接用實例.方法名時,不會創建子線程
  • import threading import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm"+self.name+"@"+str(i) # name 屬性中保存的是當前線程的名字print(msg)def login(self):pass'''如果類里面還有其他的方法想要用子線程,直接在run()方法里面調用就行(例如:self.login())如果直接用實例.方法名時,不會創建子線程,'''if __name__ == '__main__':t = MyThread()t.start() # 直接利用類的實例對象調用start()方法

    運行結果:??

    I'mThread-1@0
    I'mThread-1@1
    I'mThread-1@2

    總結

    以上是生活随笔為你收集整理的Python多任务(2.线程的概念以及组成(创建线程的两种方式))的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。