1. 程式人生 > >python多程序與多執行緒!

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()之後呼叫