国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單介紹Python中利用生成器實現的并發編程

2019-11-25 17:33:45
字體:
來源:轉載
供稿:網友

我們都知道并發(不是并行)編程目前有四種方式,多進程,多線程,異步,和協程。

多進程編程在python中有類似C的os.fork,當然還有更高層封裝的multiprocessing標準庫,在之前寫過的python高可用程序設計方法中提供了類似nginx中master process和worker process間信號處理的方式,保證了業務進程的退出可以被主進程感知。

多線程編程python中有Thread和threading,在linux下所謂的線程,實際上是LWP輕量級進程,其在內核中具有和進程相同的調度方式,有關LWP,COW(寫時拷貝),fork,vfork,clone等的資料較多,這里不再贅述。

異步在linux下主要有三種實現select,poll,epoll,關于異步不是本文的重點。

說協程肯定要說yield,我們先來看一個例子:

#coding=utf-8import timeimport sys# 生產者def produce(l):  i=0  while 1:    if i < 5:      l.append(i)      yield i      i=i+1      time.sleep(1)    else:      return   # 消費者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)

在上面的例子中,當程序執行到produce的yield i時,返回了一個generator,當我們在custom中調用p.next(),程序又返回到produce的yield i繼續執行,這樣l中又append了元素,然后我們print l.pop(),直到p.next()引發了StopIteration異常。

通過上面的例子我們看到協程的調度對于內核來說是不可見的,協程間是協同調度的,這使得并發量在上萬的時候,協程的性能是遠高于線程的。

import stacklessimport urllib2def 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()

關于協程,可以參考greenlet,stackless,gevent,eventlet等的實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽阳县| 毕节市| 天台县| 翼城县| 阳新县| 哈密市| 文山县| 龙江县| 东乌| 乌拉特后旗| 云霄县| 勐海县| 沙坪坝区| 锦州市| 宁城县| 临桂县| 孟连| 巴南区| 滨海县| 华阴市| 商城县| 孝义市| 鹤峰县| 巴里| 诏安县| 合水县| 买车| 林口县| 长葛市| 武鸣县| 水富县| 惠水县| 佛坪县| 县级市| 元阳县| 漳平市| 太湖县| 永仁县| 九寨沟县| 九台市| 扎鲁特旗|