python多線程、多進(jìn)程、協(xié)程的使用

python多線程、多進(jìn)程、協(xié)程的使用

本文主要介紹多線程、多進(jìn)程、協(xié)程的最常見使用,每個的詳細(xì)說明與介紹有時間會在以后的隨筆中體現(xiàn)。

一、多線程

1.python通過兩個標(biāo)準(zhǔn)庫thread和threading提供對線程的支持。thread提供了低級別的、原始的線程以及一個簡單的鎖。threading通過對thread模塊進(jìn)行二次封裝,提供了更方便的API來操作線程。接下來只介紹threading的常見用法。

2.使用

import threadingimport time def Traversal_5(interval):

? ? foriinxrange(5):

? ? ? ? print'Traversal_5:',i

? ? ? ? time.sleep(interval)def Traversal_10(interval):

? ? foriinxrange(10):

? ? ? ? print'Traversal_10:',i

? ? ? ? time.sleep(interval)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? tasks=[Traversal_5,Traversal_10]

? ? threads = []

? ? fortaskin tasks:

? ? ? ? t = threading.Thread(target=task,args=(1,))

? ? ? ? threads.append(t)

? ? fortin threads:

? ? ? ? t.setDaemon(True)

? ? ? ? t.start()

? ? fortin threads:

? ? ? ? t.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

單線程運行這完兩個函數(shù)至少應(yīng)該需要15秒,多線程情況下,兩個函數(shù)同時運行,總共用時是取最長的Traversal_10這個函數(shù)的時間

二、多進(jìn)程

1.由于GIL的存在,python中的多線程其實并不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進(jìn)程。Python提供了非常好用的多進(jìn)程包multiprocessing,與threading.Thread類似,它可以利用multiprocessing.Process對象來創(chuàng)建一個進(jìn)程。接下來只介紹multiprocessing的常見用法。

2.使用

import multiprocessing import time class Traversal(object):

? ? def__init__(self,interval, name):

? ? ? ? self.interval = interval

? ? ? ? self.name = name

? ? ? ? self._rungevent(self.interval, self.name)

? ? def _rungevent(self, interval, name):

? ? ? ? foriinxrange(5):

? ? ? ? ? ? print'process name:',name,'\tindex:',i

? ? ? ? ? ? time.sleep(interval)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = []

? ? forxinxrange(2):

? ? ? ? p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

? ? ? ? p.start()

? ? ? ? jobs.append(p)

? ? forjobin jobs:

? ? ? ? job.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

此程序相當(dāng)于遍歷兩次0-5的函數(shù),按理說,時間應(yīng)該是10秒,因為開了2個進(jìn)程,所以總花時和一次遍歷時間相等

三、協(xié)程

1.協(xié)程,又稱微線程,纖程。協(xié)程的特點在于是一個線程執(zhí)行,那和多線程比,協(xié)程有何優(yōu)勢?最大的優(yōu)勢就是協(xié)程極高的執(zhí)行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數(shù)量越多,協(xié)程的性能優(yōu)勢就越明顯。第三方的gevent為Python提供了比較完善的協(xié)程支持。接下來只介紹gevent用法

2.使用

fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport Pool import time def Traversal(job):

? ? print'job:',job

? ? time.sleep(1)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = [iforiinxrange(10)]

? ? pool = Pool(5)

? ? pool.map(Traversal, jobs)

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

3.結(jié)果分析

此程序本質(zhì)是遍歷0-10之間的數(shù),應(yīng)該用時10秒,由于使用了協(xié)程,開啟了5個池,所以時間減少到2秒,大大減少運行時間。

四、多進(jìn)程+協(xié)程

1.因為協(xié)程是一個線程執(zhí)行,那怎么利用多核CPU呢?最簡單的方法是多進(jìn)程+協(xié)程,既充分利用多核,又充分發(fā)揮協(xié)程的高效率,可獲得極高的性能。

2.使用

import multiprocessing fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport Poolimport time def Traver(job):

? ? print'job:',job

? ? time.sleep(1)class Traversal(object):

? ? def__init__(self,interval, name):

? ? ? ? self.interval = interval

? ? ? ? self.name = name

? ? ? ? self._rungevent(self.interval, self.name)

? ? def _rungevent(self, interval, name):

? ? ? ? jobs = [iforiinxrange(5)]

? ? ? ? pool = Pool(5)

? ? ? ? pool.map(Traver, jobs) if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = []

? ? forxinxrange(2):

? ? ? ? p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

? ? ? ? p.start()

? ? ? ? jobs.append(p)

? ? forjobin jobs:

? ? ? ? job.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

此程序本質(zhì)上是遍歷2次0-5之間數(shù)據(jù),應(yīng)該使用10秒才能運行完,由于開啟了兩個線程和5個池的協(xié)程,結(jié)果1秒就運行完了。

五、總結(jié)

從以上小例子看,多進(jìn)程、多線程和協(xié)程沒有啥差別,本文也只是主要介紹其用法。但是,要是在IO密集和CPU密集的任務(wù)下,各個之間的區(qū)別就會顯現(xiàn),這里就不做介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容