简单介绍Python中利用生成器实现的并发编程


Posted in Python onMay 04, 2015

我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程。

多进程编程在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-8
import time
import 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 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()

关于协程,可以参考greenlet,stackless,gevent,eventlet等的实现。

Python 相关文章推荐
Python学习资料
Feb 08 Python
python3.3实现乘法表示例
Feb 07 Python
python 实现删除文件或文件夹实例详解
Dec 04 Python
python super的使用方法及实例详解
Sep 25 Python
Flask框架路由和视图用法实例分析
Nov 07 Python
使用python远程操作linux过程解析
Dec 04 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
Python网页解析器使用实例详解
May 30 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
简单分析Python中用fork()函数生成的子进程
May 04 #Python
python实现从字典中删除元素的方法
May 04 #Python
Python中利用原始套接字进行网络编程的示例
May 04 #Python
python通过索引遍历列表的方法
May 04 #Python
python实现将元祖转换成数组的方法
May 04 #Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 #Python
python通过定义一个类实例作为ftp回调方法
May 04 #Python
You might like
生成sessionid和随机密码的例子
2006/10/09 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
Python中用于返回绝对值的abs()方法
2015/05/14 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
django实现前后台交互实例
2017/08/07 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Random 在 Python 中的使用方法
2018/08/09 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
物业工作计划书
2014/01/10 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
遗嘱格式范本
2015/08/07 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
妇产科护理心得体会
2016/01/22 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书