python多程序與多執行緒!
有關程序、執行緒、多程序、多執行緒
執行緒與程序
概念
執行緒:是程式執行流的最小單元,是系統獨立排程和分配CPU(獨立執行)的基本單位。
程序:是資源分配的基本單位。一個程序包括多個執行緒。
區別
1.執行緒與資源分配無關,它屬於某一個程序,並與程序內的其他執行緒一起共享程序的資源。
2.每個程序都有自己一套獨立的資源(資料),供其內的所有執行緒共享。
3.不論是大小,開銷執行緒要更“輕量級”
4.一個程序內的執行緒通訊比程序之間的通訊更快速,有效。(因為共享變數)
多執行緒與多程序
多執行緒:同一時刻執行多個執行緒。用瀏覽器一邊下載,一邊聽歌,一邊看視訊,一邊看網頁。
多程序:同時執行多個程式。如,同時執行YY,QQ,以及各種瀏覽器。
併發與並行
併發當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。
並行:當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。
更多的解釋
請參考部落格園
python開啟多執行緒、多程序
使用threading模組開啟多執行緒
Thread類是threading模組中最重要也是最基本的一個類,它支援使用兩種方法來建立執行緒,一種方法是為建構函式傳遞一個可呼叫物件,同時可以傳遞引數,只不過要求引數必須為元組形式;另一種方法是繼承Thread類並在派生類中重寫__init__()和run()方法。建立執行緒物件以後,可以呼叫其start()方法來啟動,該方法自動呼叫該類物件的run()方法。比如
import threading
def func1(x):
while x:
print(x)
x = x -1
threading.Thread(target=func1,args=(5,)).start()
1
2
3
4
5
6
Thread物件的daemon屬性
當某子執行緒的daemon屬性為True時主執行緒執行結束時不對子執行緒進行檢查而直接退出,同時所有daemon值為True的子執行緒將隨主執行緒一起結束,無論是否執行完成。daemon屬性的預設值為False,如需修改,則必須在呼叫start()方法啟動執行緒之前修改。
使用_thread模組(不推薦)
比如上面的程式碼可改為
import _thread
import time
def func1(x):
while x:
print(x)
x = x -1
_thread.start_new_thread(func1,(5,))
time.sleep(6)
進群:960410445 即可獲取數十套PDF!
這裡為了防止主執行緒結束時子執行緒還未執行完成,阻塞了主執行緒6s
python開啟多程序
與使用threading模組中的Thread物件建立和啟動執行緒類似,可以通過multiprocessing模組中的Process物件來建立和啟動程序。比如
from multiprocessing import Process
import os
def f(name):
print('module name:',__name__)
print('parent process id',os.getppid())
print('this process id',os.getpid())
print('this process name',name)
if __name__ =='__main__':
p=Process(target=f,args=('ins',))
p.start()
如果要考慮建立多個子程序可以使用multiprocessing.Pool類。該類可以建立一個程序池,然後在多個核上執行這些程序。例如:
import multiprocessing
import time
def func(msg):
print(multiprocessing.current_process().name + '-' + msg )
#使程序阻塞3s,不然程序執行太快,一個程序就瞬間完執行所有的任務
#這樣的話,上面列印的程序名是同一個,出現偽多程序的錯覺
time.sleep(3)
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4) # 建立4個程序
for i in range(3):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, ))
#當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;
# 但如果池中的程序數已經達到規定最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來它
pool.close() # 關閉程序池,表示不能在往程序池中新增程序
pool.join() # 等待程序池中的所有程序執行完畢,必須在close()之後呼叫