【Python之旅】第六篇(三):Python多執行緒及其使用方法
在前面使用Python Socket來編寫簡版SSH程式的時候,其實已經有使用多執行緒,不過當時對多執行緒的概念並不能很好的理解,在看了《程式與執行緒的一個簡單解釋》與學習了Python多執行緒之後,也算是有一個大致的理解了。
內容主要如下:
1
2
3
|
1 .Python中的多執行緒
2 .Python多執行緒使用方法 1
3 .Python多執行緒使用方法 2
|
1.Python中的多執行緒
執行一個程式,即在作業系統中開啟了一個程式,在某一時刻,一個CPU核心只能進行一個程式的任務,現在的計算機所說的多程式/多工其實是通過加快CPU的執行速度來實現的,因為一個CPU每秒能執行上億次的計算,能夠對程式進行很多次切換,所以在人為可以感知的時間裡,看上去,計算機確實是在同時執行多個程式,即同時處理多個程式。
一個程式中可以包含有多個執行緒,這多個執行緒為實現該程式的某個主要功能而執行著,多個執行緒可以進行序列工作,也可以併發同時進行工作,顯然後者可以節省更多的時間。
在Python中是支援多執行緒併發執行的,只是Python中的多執行緒只能利用單核,也就是說Python中的某一個程式的多個執行緒只能在一個CPU核心上執行,而不能分配在多個CPU核心中執行,這是考慮到執行緒安全的緣故,而Python中的GIL則保證了執行緒安全。關於Python中的GIL,可以參考下面一篇文章:《淺析Python的GIL和執行緒安全》。
下面是自己在學習過程中的一些課堂筆記,因為還沒有真正學習一些理論,所以可能會有些錯誤,但目前是方便自己的理解:
1
2
3
4
5
6
7
8
9
|
即GLI是以CPU核心為單位來控制全域性鎖,所以是不能跨不同的CPU(核心 )的 GLI可以保證同一個程式中,某一個執行緒的共享資料在某一時刻只能同時被另外一個執行緒修改(使用), 而不能同時被多個執行緒修改(使用),如果去掉GLI,則需要自己為執行緒加鎖,這樣之後,效能比原來還要差。 當然,難道就不能充分利用多核CPU或多個CPU了? 做成多程式就可以了,不同的程式執行在不同的CPU(核心)上,也可以實現併發, 只是這樣的話就會比較浪費記憶體空間,考慮同時執行 10 個QQ程式的情況,
假如 1 個QQ佔用500M的記憶體空間,則 10 個QQ就要佔用5G的記憶體空間了。但如果是多執行緒的話,
可能 10 個QQ還是共享著這500M的記憶體空間。還有一個缺點就是,多程式間的資料直接訪問可能
會比較麻煩,但其實也是可以實現的,比如chrome瀏覽器就是用多程式實現的。 |
目前首先要明確的是,Python中是不能把一個程式的多個執行緒分佈在不同的CPU核心上執行的。
2.Python多執行緒使用方法1
給出下面的程式程式碼及註釋:
1
2
3
4
5
6
7
8
9
10
|
import threading #Python多執行緒模組
import time
def run(num): print `Hi, I am thread %s..lalala` % num
time.sleep( 1 )
for i in range( 20 ):
t = threading.Thread(target=run, args=(i,)) #多執行緒使用方法,target為需要執行多執行緒的函式,args為函式中的引數,注意這裡的引數寫成(i,),即如果只能一個引數,也要加上一個 ","
t.start() #開始執行多執行緒
|
程式執行結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python thread4.py Hi, I am thread 0 ..lalala
Hi, I am thread 1 ..lalala
Hi, I am thread 2 ..lalala
Hi, I am thread 3 ..lalala
Hi, I am thread 4 ..lalala
Hi, I am thread 5 ..lalala
Hi, I am thread 6 ..lalala
Hi, I am thread 7 ..lalala
Hi, I am thread 8 ..lalala
Hi, I am thread 9 ..lalala
Hi, I am thread 10 ..lalala
Hi, I am thread 11 ..lalala
Hi, I am thread 12 ..lalala
Hi, I am thread 13 ..lalala
Hi, I am thread 14 ..lalala
Hi, I am thread 15 ..lalala
Hi, I am thread 16 ..lalala
Hi, I am thread 17 ..lalala
Hi, I am thread 18 ..lalala
Hi, I am thread 19 ..lalala
|
直接看執行結果是看不出什麼的,這裡說一下這個程式的執行過程:0到19是同時列印輸入的,在列印19後,程式sleep 1秒後才結束程式的執行。
上面這個程式有20個執行緒執行,每個執行緒都是:列印字串+sleep(1)。我們實際看到的結果是0到19同時列印,然後才sleep 1秒,但是需要注意的是,並非是20個執行緒才執行一次sleep(1),而是在每個執行緒中都執行了一次sleep(1),即該程式實際上是執行了20次sleep(1),而我們實際看到的結果是程式執行時僅僅是暫停了1秒,那是因為這20次sleep(1)是併發執行的。
上面的程式可以這麼去理解:20個執行緒相當於有20匹馬,20匹馬同時起跑(列印字串),然後以同時停1秒(sleep(1)),最後同時到達終點(20個執行緒執行結束,即程式執行結束)。
為了更好的理解上面的程式,可以把上面的程式碼改為如下:
1
2
3
4
5
6
7
8
9
10
11
|
import threading
import time
def run(num): print `Hi, I am thread %s..lalala` % num
time.sleep( 1 )
for i in range( 20 ):
t = threading.Thread(target=run, args=(i,))
t.start()
t.join() #等上一個執行緒執行完後再執行下一個執行緒
|
執行結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python thread4.py Hi, I am thread 0 ..lalala
Hi, I am thread 1 ..lalala
Hi, I am thread 2 ..lalala
Hi, I am thread 3 ..lalala
Hi, I am thread 4 ..lalala
Hi, I am thread 5 ..lalala
Hi, I am thread 6 ..lalala
Hi, I am thread 7 ..lalala
Hi, I am thread 8 ..lalala
Hi, I am thread 9 ..lalala
Hi, I am thread 10 ..lalala
Hi, I am thread 11 ..lalala
Hi, I am thread 12 ..lalala
Hi, I am thread 13 ..lalala
Hi, I am thread 14 ..lalala
Hi, I am thread 15 ..lalala
Hi, I am thread 16 ..lalala
Hi, I am thread 17 ..lalala
Hi, I am thread 18 ..lalala
Hi, I am thread 19 ..lalala
|
執行結果看上去跟前面是一樣的,但執行過程卻是這樣的:每列印一次字串,再暫停一秒。
通過這個程式,也就可以更好的理解Python的多執行緒併發執行了,當然,因為這是一個動態的過程,所以把程式執行一遍後會有更好的理解。
3.Python多執行緒使用方法2
程式程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import threading,time
class MyThread(threading.Thread):
def __init__(self, num):
threading.Thread.__init__(self)
self.num = num
def run(self): # this name must be `run`
print `I am thread %s` % self.num
time.sleep( 2 )
for i in range( 20 ):
t = MyThread(i)
t.start()
|
程式的執行結果與方法1是一樣的,這裡就不給出了,只是這裡利用了物件導向程式設計的思想方法來設計程式程式碼。
本文轉自 xpleaf 51CTO部落格,原文連結:http://blog.51cto.com/xpleaf/1701903,如需轉載請自行聯絡原作者
相關文章
- Python 多執行緒多程式Python執行緒
- python有多執行緒嗎Python執行緒
- python3 多執行緒Python執行緒
- 04.python-多執行緒Python執行緒
- python--多工執行緒Python執行緒
- Python 多執行緒及程式Python執行緒
- python多執行緒基礎Python執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- 入門python多執行緒/多程式Python執行緒
- Python的多程式和多執行緒Python執行緒
- Python中的多工:多執行緒Python執行緒
- Python多執行緒與GIL鎖Python執行緒
- python進階(9)多執行緒Python執行緒
- python 多執行緒程式設計Python執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- Python——程式、執行緒、協程、多程式、多執行緒(個人向)Python執行緒
- python多程式取代多執行緒的探究Python執行緒
- python 多程式和多執行緒學習Python執行緒
- [譯] Python 的多執行緒與多程式Python執行緒
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- Python執行緒專題10:queue、多執行緒按順序執行Python執行緒
- 「SDL第六篇」孫悟空與多執行緒執行緒
- 多執行緒(三)執行緒
- 代理ip 多執行緒 python寫法執行緒Python
- Python 之 threading(多執行緒)用法教程Pythonthread執行緒
- python之 threading(多執行緒)模組Pythonthread執行緒
- Python《多執行緒併發爬蟲》Python執行緒爬蟲
- 一文看懂python多執行緒Python執行緒
- Python學習筆記 - 多執行緒Python筆記執行緒
- 什麼是Python執行緒?Python執行緒如何建立?Python執行緒
- python面試題之python下多執行緒的限制Python面試題執行緒
- Python簡單實現多執行緒例子Python執行緒
- python多執行緒-共享全域性變數Python執行緒變數
- python中的socket+threading多執行緒Pythonthread執行緒
- python中多執行緒和多程序的應用Python執行緒
- python爬蟲入門八:多程式/多執行緒Python爬蟲執行緒
- python之多執行緒Python執行緒
- 多執行緒系列(三):執行緒池基礎執行緒
- 從偽並行的 Python 多執行緒說起並行Python執行緒