python之线程,不得不了解的硬知识!
生活随笔
收集整理的這篇文章主要介紹了
python之线程,不得不了解的硬知识!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么是線程
-
進程:資源單位
-
線程:執行單位
-
進程:資源單位(起一個進程僅僅只是在內存空間中開辟一塊獨立的空間)
-
線程:執行單位(真正被cpu執行的其實是進程里面的線程,線程指的就是代碼的執行過程,執行代碼中所需要使用到的資源都找所在的進程索要)
進程和線程都是虛擬單位,只是為了我們更加方便的描述問題
二、為什么要有線程
- 開設進程
1.申請內存空間 耗資源
2.“拷貝代碼” 耗資源 - 開線程
一個進程內可以開設多個線程,在用一個進程內開設多個線程無需再次申請內存空間操作 - 總結:
開設線程的開銷要遠遠的小于進程的開銷
同一個進程下的多個線程數據是共享的!!!
三、怎么開啟線程
- 開進程和開線程的步驟基本都是一樣的 只是導入的模塊不一樣而已
- 開進程代碼必須寫在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中 # 但是習慣性的將啟動命令寫在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() # 主線程等待子線程運行結束再執行print('主')五、同一個進程下的多個線程數據是共享的
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'活躍的線程數:{active_count()}')七、守護線程
- 主線程運行結束之后不會立刻結束 會等待所有其他非守護線程結束才會結束
- 因為主線程的結束意味著所在的進程的結束。如果大家對Python感興趣的話,可以加一下我們的學習交流摳摳群哦:649825285,免費領取一套學習資料和視頻課程喲~
八、線程互斥鎖
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)總結
以上是生活随笔為你收集整理的python之线程,不得不了解的硬知识!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帝国CMS后台前台上传大小和类型限制的解
- 下一篇: 2-1 什么是人工智能|人工智能框架Te