簡單介紹Python中利用生成器實(shí)現(xiàn)的并發(fā)編程
我們都知道并發(fā)(不是并行)編程目前有四種方式,多進(jìn)程,多線程,異步,和協(xié)程。
多進(jìn)程編程在python中有類似C的os.fork,當(dāng)然還有更高層封裝的multiprocessing標(biāo)準(zhǔn)庫,在之前寫過的python高可用程序設(shè)計(jì)方法中提供了類似nginx中master process和worker process間信號(hào)處理的方式,保證了業(yè)務(wù)進(jìn)程的退出可以被主進(jìn)程感知。
多線程編程python中有Thread和threading,在linux下所謂的線程,實(shí)際上是LWP輕量級(jí)進(jìn)程,其在內(nèi)核中具有和進(jìn)程相同的調(diào)度方式,有關(guān)LWP,COW(寫時(shí)拷貝),fork,vfork,clone等的資料較多,這里不再贅述。
異步在linux下主要有三種實(shí)現(xiàn)select,poll,epoll,關(guān)于異步不是本文的重點(diǎn)。
說協(xié)程肯定要說yield,我們先來看一個(gè)例子:
#coding=utf-8 import time import sys # 生產(chǎn)者 def produce(l): i=0 while 1: if i < 5: l.append(i) yield i i=i+1 time.sleep(1) else: return # 消費(fèi)者 def consume(l): p = produce(l) while 1: try: p.next() while len(l) > 0: print l.pop() except StopIteration: sys.exit(0) l = [] consume(l)
在上面的例子中,當(dāng)程序執(zhí)行到produce的yield i時(shí),返回了一個(gè)generator,當(dāng)我們?cè)赾ustom中調(diào)用p.next(),程序又返回到produce的yield i繼續(xù)執(zhí)行,這樣l中又append了元素,然后我們print l.pop(),直到p.next()引發(fā)了StopIteration異常。
通過上面的例子我們看到協(xié)程的調(diào)度對(duì)于內(nèi)核來說是不可見的,協(xié)程間是協(xié)同調(diào)度的,這使得并發(fā)量在上萬的時(shí)候,協(xié)程的性能是遠(yuǎn)高于線程的。
import stackless import urllib2 def output(): while 1: url=chan.receive() print url f=urllib2.urlopen(url) #print f.read() print stackless.getcurrent() def input(): f=open('url.txt') l=f.readlines() for i in l: chan.send(i) chan=stackless.channel() [stackless.tasklet(output)() for i in xrange(10)] stackless.tasklet(input)() stackless.run()
關(guān)于協(xié)程,可以參考greenlet,stackless,gevent,eventlet等的實(shí)現(xiàn)。
相關(guān)文章
使用Python的PIL模塊來進(jìn)行圖片對(duì)比
這篇文章主要介紹了使用Python的PIL模塊來進(jìn)行圖片對(duì)比的方法,搜索引擎最基本的圖片搜索也是利用圖片顏色值的對(duì)比來實(shí)現(xiàn)的,需要的朋友可以參考下2016-02-02tensorboard 可以顯示graph,卻不能顯示scalar的解決方式
今天小編就為大家分享一篇tensorboard 可以顯示graph,卻不能顯示scalar的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python之pygame模塊實(shí)現(xiàn)飛機(jī)大戰(zhàn)完整代碼
這篇文章主要為大家詳細(xì)介紹了python之pygame模塊實(shí)現(xiàn)飛機(jī)大戰(zhàn)完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11使用Python函數(shù)進(jìn)行模塊化的實(shí)現(xiàn)
這篇文章主要介紹了使用Python函數(shù)進(jìn)行模塊化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python打開文件,將list、numpy數(shù)組內(nèi)容寫入txt文件中的方法
今天小編就為大家分享一篇Python打開文件,將list、numpy數(shù)組內(nèi)容寫入txt文件中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10python 定時(shí)器,實(shí)現(xiàn)每天凌晨3點(diǎn)執(zhí)行的方法
今天小編就為大家分享一篇python 定時(shí)器,實(shí)現(xiàn)每天凌晨3點(diǎn)執(zhí)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02python實(shí)現(xiàn)一次創(chuàng)建多級(jí)目錄的方法
這篇文章主要介紹了python實(shí)現(xiàn)一次創(chuàng)建多級(jí)目錄的方法,涉及Python中os模塊makedirs方法的使用技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-05-05