windows下多进程加协程并发模式
好久沒更新博客了。正好最近要整理一下最近這段時(shí)間做過的項(xiàng)目以及學(xué)習(xí)python的一些心得。如標(biāo)題所示,今天就來說說windows下多進(jìn)程加協(xié)程并發(fā)模式。其實(shí)網(wǎng)上還是蠻多在linux下的多進(jìn)程加協(xié)程并發(fā)模式,本身linux對python的支持更好吧。但是由于本人的開發(fā)環(huán)境是windows的,而且網(wǎng)上關(guān)于這方面的資料還是少了一點(diǎn),不過經(jīng)過一番折騰,也算是弄出來了。廢話不多說,先貼代碼吧:
# coding=utf-8 # windows下多進(jìn)程加協(xié)程并發(fā)模式 # 打入gevent的monkey補(bǔ)丁 from gevent import monkey monkey.patch_all() # 導(dǎo)入?yún)f(xié)程池 from gevent.pool import Pool import urllib2 # 導(dǎo)入多進(jìn)程模塊 import multiprocessing import time # 定義一個(gè)爬取微博網(wǎng)頁的方法 def html(url=u'http://weibo.com/'):# 用上多進(jìn)程的鎖機(jī)制,用于防止連續(xù)打印lock = multiprocessing.Lock()try:h = urllib2.urlopen(url).read()except:lock.acquire()print u'連接錯(cuò)誤'lock.release()else:lock.acquire()print u'done'lock.release()# 定義一個(gè)協(xié)程并發(fā)方法(用的是gevent的協(xié)程池) def a(num):pool = Pool(100)# 協(xié)程池的map方法可以讓你自定義并發(fā)次數(shù),這里可以自定義爬取微博網(wǎng)頁的并發(fā)次數(shù),第一個(gè)參數(shù)是要執(zhí)行的函數(shù)# 第二個(gè)參數(shù)可以理解成需要并發(fā)參數(shù)的次數(shù)pool.map(html, [u'http://weibo.com/' for i in xrange(num)])pool.kill()pool.join()# 這個(gè)是比較關(guān)鍵的一個(gè)方法,就是協(xié)程加多進(jìn)程的并發(fā)模式 def b(num):t = []# 建立10個(gè)進(jìn)程來并行協(xié)程即方法afor i in xrange(10):p = multiprocessing.Process(target=a, args=(num,))p.start()t.append(p)for each in t:each.join()# 對比多進(jìn)程加協(xié)程與純粹協(xié)程的各自的并發(fā)狀態(tài) if __name__ == '__main__':print u'方法b開始計(jì)時(shí):'start = time.time()b(10)print u'方法b總共花費(fèi)%f秒' % (time.time() - start)print u'方法a開始計(jì)時(shí):'start = time.time()a(100)print u'方法a總共花費(fèi)%f秒' % (time.time() - start)上面的代碼注釋的挺清楚的了,下面貼一下執(zhí)行的結(jié)果吧:
?
?
從上面的結(jié)果可以看到,執(zhí)行協(xié)程加多進(jìn)程的方法b時(shí),多核cpu是可以被充分利用的,這是單純使用協(xié)程方式無法做到的,這也是多進(jìn)程的一大好處吧。由于我這里實(shí)驗(yàn)的是100次并發(fā),所以其實(shí)就效果來說還不是很明顯,但是當(dāng)你要瞬時(shí)并發(fā)一千個(gè)或者一萬個(gè)的時(shí)候,差距就可以顯現(xiàn)出來了,顯然,協(xié)程加多進(jìn)程的方式是更加牛叉的,這種模式充分把兩者的優(yōu)點(diǎn)結(jié)合起來了。
這里如果讀者對python的協(xié)程模塊與多進(jìn)程模塊不熟悉的話,還是自行百度一下吧。畢竟自己真正理解了才是自己的東西啊。其實(shí)我也還是個(gè)python菜鳥,如果上面的代碼有啥問題或者更好的建議的話,還希望大神們不吝賜教呀!
?
轉(zhuǎn)載于:https://www.cnblogs.com/ExMan/p/10165754.html
總結(jié)
以上是生活随笔為你收集整理的windows下多进程加协程并发模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab周期图法使用FFT实现
- 下一篇: 网络IO模型