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