python學習二之多執行緒
1.執行緒
多工可以由多程序完成,也可以由乙個程序內的多執行緒完成。
我們前面提到了程序是由若干執行緒組成的,乙個程序至少有乙個執行緒。
由於執行緒是作業系統直接支援的執行單元,因此,高階語言通常都內建多執行緒的支援,python也不例外,並且,python的執行緒是真正的posix thread,而不是模擬出來的執行緒。
python的標準庫提供了兩個模組:_thread
和threading
,_thread
是低階模組,threading
是高階模組,對_thread
進行了封裝。絕大多數情況下,我們只需要使用threading
這個高階模組。
啟動乙個執行緒就是把乙個函式傳入並建立thread
例項,然後呼叫start()
開始執行
#執行結果:!/usr/bin/env python
#_*_ coding: utf-8 _*_
#author:chenjianwen
import
sysreload(sys)
sys.setdefaultencoding(
"utf-8")
import
time
import
threading
defloop():
print('
thread %s is tunning...
' %threading.current_thread().name) #
子執行緒#
threading.current_thread().name 列印執行緒的名字
n =0
while n < 5:
n = n + 1
print('
thread %s >>> %s
' %(threading.current_thread().name,n)) #
子執行緒 time.sleep(1)
print('
thread %s ended...
' % threading.current_thread().name) #
子執行緒print('
thread %s is running...
' %threading.current_thread().name) #
主線程t = threading.thread(target=loop)
t.start()
t.join()
print('
thread %s ended...
' %threading.current_thread().name) #
主線程
2.執行緒lock
當多個執行緒同時執行lock.acquire()
時,只有乙個執行緒能成功地獲取鎖,然後繼續執行**,其他執行緒就繼續等待直到獲得鎖為止。
獲得鎖的執行緒用完後一定要釋放鎖,否則那些苦苦等待鎖的執行緒將永遠等待下去,成為死執行緒。所以我們用try...finally
來確保鎖一定會被釋放。
鎖的好處就是確保了某段關鍵**只能由乙個執行緒從頭到尾完整地執行,壞處當然也很多,首先是阻止了多執行緒併發執行,包含鎖的某段**實際上只能以單執行緒模式執行,效率就大大地下降了。其次,由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖,導致多個執行緒全部掛起,既不能執行,也無法結束,只能靠作業系統強制終止。
#3.小結在python中,可以使用多執行緒,但不要指望能有效利用多核。如果一定要通過多執行緒利用多核,那只能通過c擴充套件來實現,不過這樣就失去了python簡單易用的特點。!/usr/bin/env python
#_*_ coding: utf-8 _*_
#author:chenjianwen
import
sysreload(sys)
sys.setdefaultencoding(
"utf-8")
import
time
import
threading
balance =0
lock =threading.lock()
def change_it(n): #
此函式正常執行結果為0
global
balance
balance = balance +n
balance = balance -n
defrun_thread(n):
for i in range(1000):
#先獲取鎖
lock.acquire()
try:
change_it(n)
finally
:
#改完了一定要釋放鎖
lock.release()
t1 = threading.thread(target=run_thread,args=(5,))
t2 = threading.thread(target=run_thread,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
不過,也不用過於擔心,python雖然不能利用多執行緒實現多核任務,但可以通過多程序實現多核任務。多個python程序有各自獨立的gil鎖,互不影響。
多執行緒程式設計,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生。
python直譯器由於設計時有gil全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在python中就是乙個美麗的夢。
python之多執行緒(學習)
執行緒分為 核心執行緒 由作業系統核心建立和撤銷 使用者執行緒 不需要核心支援而在使用者程式中實現的執行緒python3 執行緒中常用的兩個模組 thread和threading 推薦使用 python中使用執行緒有兩種方式 函式或者用類來包裝執行緒物件函式式 呼叫模組 import thread ...
Python之多執行緒
1 呼叫thread模組中的start new thread 函式來產生新執行緒 thread.start new thread function,args kwargs function 執行緒函式。args 傳遞給執行緒函式的引數,他必須是個tuple型別。kwargs 可選引數。2 使用thr...
python之多執行緒
學習了一下多執行緒 用到爬蟲裡面簡直爽歪歪呀 定義就很簡單,為了實現高併發,能夠同時在乙個指令碼下執行多個程式,節約時間 新增執行緒用到的 import threading as td def sum num1,num2 sum num1 num2 print sss sum def divided...