python中线程和进程_python中线程和进程的简单了解
一、操作系統、應用程序
1.硬件:硬盤、cpu、主板、顯卡........
2.裝系統(本身也是一個軟件):
系統就是一個由程序員寫出來的軟件,該軟件用于控制計算機得硬盤,讓他們之間進行互相配合。
3.安裝軟件:各種應用程序
二、并發和并行
并發:偽,由于執行速度特別快,人感覺不到停頓
并行:真,創建多個對象同時操作
三、線程、進程
1.單進程、單線程的應用程序
print("asd")
2.到底什么是線程、進程
python中沒有這兩個,是python調用的操作系統的線程和進程
3.單進程、多線程的應用程序
importthreading #兩個進程print("start")deffunc(arg):print(arg)
t= threading.Thread(target=func,args=("......",))
t.start()print("end")#start#......#end
一個應用程序(軟件),可以有多個進程(默認只有一個),一個進程中可以創建多個線程(默認一個)
總結:
1.操作系統幫助開發者操作硬件
2.程序員寫好代碼在操作系統上運行(依賴解釋器)
1.線程的基本使用
importthreadingdeffunc(arg):print(arg)
t= threading.Thread(target=func,args=(11,))
t.start()print(22)#11#22
View Code
2.主線程默認等子線程執行完畢
importtimedeffunc(arg):
time.sleep(arg)print(arg)
t1= threading.Thread(target=func,args=(2,))
t1.start()
t2= threading.Thread(target=func,args=(4,))
t2.start()print("end")#end#2#4
View Code
3.主線程不再等待子線程,主線程終止所有的子線程也終止
deffunc(arg):
time.sleep(arg)print(arg)
t1= threading.Thread(target=func,args=(2,))
t1.setDaemon(True)
t1.start()
t2= threading.Thread(target=func,args=(4,))
t2.setDaemon(True)
t2.start()print("end")#end
View Code
4.開發者可以控制主線程等待子線程的(最多等待時間)
deffunc(arg):
time.sleep(0.01)print(arg)print('創建子線程t1')
t1= threading.Thread(target=func,args=(3,))
t1.start()#無參數,讓主線程在這里等著,等到子線程t1執行完畢,才可以繼續往下走。#有參數,讓主線程在這里最多等待n秒,無論是否執行完畢,會繼續往下走。
t1.join(2)print('創建子線程t2')
t2= threading.Thread(target=func,args=(9,))
t2.start()
t2.join(2) #讓主線程在這里等著,等到子線程t2執行完畢,才可以繼續往下走。
print(123)deffunc(arg):
time.sleep(0.01)print(arg)print('創建子線程t1')
t1= threading.Thread(target=func,args=(3,))
t1.start()#無參數,讓主線程在這里等著,等到子線程t1執行完畢,才可以繼續往下走。#有參數,讓主線程在這里最多等待n秒,無論是否執行完畢,會繼續往下走。
t1.join(2)print('創建子線程t2')
t2= threading.Thread(target=func,args=(9,))
t2.start()
t2.join(2) #讓主線程在這里等著,等到子線程t2執行完畢,才可以繼續往下走。
print(123)
View Code
5.線程名稱
deffunc(arg):
t= threading.current_thread() #獲取到執行當前函數的線程對象
name =t.getName()print(name,arg)
t1= threading.Thread(target=func,args=(1,))
t1.setName("t1") #為線程創建名稱
t1.start()
t2= threading.Thread(target=func,args=(2,))
t2.setName("t2")
t2.start()print("end")#t1 1#t2 2#end
View Code
6.線程的本質
#先打印:11?end?
deffunc(arg):print(arg)
t1= threading.Thread(target=func,args=(11,))
t1.start()#start 是開始運行線程嗎?不是#start 告訴cpu,我已經準備就緒,你可以調度我了。
print("end")
View Code
7.面向對象版本的多線程
importthreadingclassMyThread(threading.Thread):defrun(self):print(11111,self._args,self._kwargs) #********
t1 = MyThread(args=(11,))
t1.start()print("end")#11111 (11,) {}#end
View Code
python多線程情況下:
計算密集型操作:效率低(GIL鎖)
IO操作:效率高
python多進程的情況下:
計算密集型:效率高(浪費資源)
IO操作:效率高(浪費資源)
在使用時:
IO密集型用多線程:文件、輸入、輸出、socket網絡通信
計算密集型用多進程
四、python中線程和進程(GIL鎖)
GIL鎖,全局解釋器鎖,用于限制一個進程中同一時刻只有一個線程被cpu調度。
擴展:默認GIL鎖在執行100個cup指令(過期時間)
importsys
v1=sys.getcheckinterval()print(v1)#100
importtimeimportthreading
lock= threading.RLock() #實例化一個鎖的對象
n = 10
deffunc(i):print("這段代碼不加鎖",i)
lock.acquire()#加鎖次區域的代碼同一時刻只能有一個線程執行
globalnprint("當前線程",i,"讀取到的n值",n)
n=i
time.sleep(1)print("當前線程",i,"修改n值為",n)
lock.release()#釋放鎖
for i in range(10):
t= threading.Thread(target=func,args=(i,))
t.start()#這段代碼不加鎖 0#當前線程 0 讀取到的n值 10#這段代碼不加鎖 1#這段代碼不加鎖 2#這段代碼不加鎖 3#這段代碼不加鎖 4#這段代碼不加鎖 5#這段代碼不加鎖 6#這段代碼不加鎖 7#這段代碼不加鎖 8#這段代碼不加鎖 9#當前線程 0 修改n值為 0#當前線程 1 讀取到的n值 0#當前線程 1 修改n值為 1#當前線程 2 讀取到的n值 1#當前線程 2 修改n值為 2#當前線程 3 讀取到的n值 2#當前線程 3 修改n值為 3#當前線程 4 讀取到的n值 3#當前線程 4 修改n值為 4#當前線程 5 讀取到的n值 4#當前線程 5 修改n值為 5#當前線程 6 讀取到的n值 5#當前線程 6 修改n值為 6#當前線程 7 讀取到的n值 6#當前線程 7 修改n值為 7#當前線程 8 讀取到的n值 7#當前線程 8 修改n值為 8#當前線程 9 讀取到的n值 8#當前線程 9 修改n值為 9
View Code
總結
以上是生活随笔為你收集整理的python中线程和进程_python中线程和进程的简单了解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python string length
- 下一篇: 换手机了!卢伟冰喜提小米12:最快明日官