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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python之线程,不得不了解的硬知识!

發(fā)布時間:2025/3/15 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python之线程,不得不了解的硬知识! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是線程

  • 進程:資源單位

  • 線程:執(zhí)行單位

  • 進程:資源單位(起一個進程僅僅只是在內(nèi)存空間中開辟一塊獨立的空間)

  • 線程:執(zhí)行單位(真正被cpu執(zhí)行的其實是進程里面的線程,線程指的就是代碼的執(zhí)行過程,執(zhí)行代碼中所需要使用到的資源都找所在的進程索要)

進程和線程都是虛擬單位,只是為了我們更加方便的描述問題

二、為什么要有線程

  • 開設(shè)進程
    1.申請內(nèi)存空間 耗資源
    2.“拷貝代碼” 耗資源
  • 開線程
    一個進程內(nèi)可以開設(shè)多個線程,在用一個進程內(nèi)開設(shè)多個線程無需再次申請內(nèi)存空間操作
  • 總結(jié):
    開設(shè)線程的開銷要遠(yuǎn)遠(yuǎn)的小于進程的開銷
    同一個進程下的多個線程數(shù)據(jù)是共享的!!!

三、怎么開啟線程

  • 開進程和開線程的步驟基本都是一樣的 只是導(dǎo)入的模塊不一樣而已
  • 開進程代碼必須寫在main下面而開線程則無需這么做

3.1、方式一

from threading import Thread import timedef task(name):print(F'{name} is running')time.sleep(1)print(F'{name} is stopping')# 開線程的代碼不需要寫在main中 # 但是習(xí)慣性的將啟動命令寫在main下面t = Thread(target=task,args=('tzh',)) t.start() print('我是主線程')

3.2、方式二

from threading import Thread import timeclass MyThead(Thread):def __init__(self,name):#重寫別人的方法super().__init__()self.name = namedef run(self):print(F'{self.name} is running')time.sleep(1)print(F'{self.name} is stoppings')print('tzh666') if __name__ == '__main__':t = MyThead('tzh')t.start()

四、線程對象的join方法

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

五、同一個進程下的多個線程數(shù)據(jù)是共享的

from threading import Thread import timemoney = 100def task():global moneymoney = 666print(money)if __name__ == '__main__':t = Thread(target=task)t.start()t.join()print(money)

六、線程對象屬性及其他方法

from threading import Thread, active_count, current_thread import os, timedef task():print(F'子進程號是:{os.getpid()}')print(F'子線程名字是:{current_thread().name}')time.sleep(2)if __name__ == '__main__':t = Thread(target=task)t.start()#打印出來是一樣的,因為他們在同一個下進程中print(F'主進程號是:{os.getpid()}')print(F'主線程名字是:{current_thread().name}')print(F'活躍的線程數(shù):{active_count()}')

七、守護線程

  • 主線程運行結(jié)束之后不會立刻結(jié)束 會等待所有其他非守護線程結(jié)束才會結(jié)束
  • 因為主線程的結(jié)束意味著所在的進程的結(jié)束。如果大家對Python感興趣的話,可以加一下我們的學(xué)習(xí)交流摳摳群哦:649825285,免費領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
from threading import Thread import timedef task(name):print('%s is running'%name)time.sleep(1)print('%s is over'%name)if __name__ == '__main__':t = Thread(target=task, args=('tzh', ))t.daemon = Truet.start()print('主') from threading import Thread import timedef foo():print(123)time.sleep(1)print('end123')def func():print(456)time.sleep(3)print('end456')if __name__ == '__main__':t1 = Thread(target=foo)t2 = Thread(target=func)t1.daemon = Truet1.start()t2.start()print('主.......')--輸出-- 123 456 主....... end123 end456

八、線程互斥鎖

from threading import Thread, Lock import timemoney = 100 mutex = Lock()def task():global money#上鎖mutex.acquire()tmp = moneytime.sleep(0.1)money = tmp - 1#用完之后釋放mutex.release()if __name__ == '__main__':t_list = []for i in range(100):t = Thread(target=task)t.start()t_list.append(t)for t in t_list:t.join()print(money)

總結(jié)

以上是生活随笔為你收集整理的python之线程,不得不了解的硬知识!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。