简单介绍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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
Python collections模块实例讲解
Apr 07 Python
Python中的time模块与datetime模块用法总结
Jun 30 Python
Python使用django搭建web开发环境
Jun 09 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python数据挖掘需要学的内容
Jun 23 Python
Python Web框架之Django框架文件上传功能详解
Aug 16 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
python在地图上画比例的实例详解
Nov 13 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
js 作用域和变量详解
2017/02/16 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
python如何实现异步调用函数执行
2019/07/08 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
英语道歉信范文
2014/01/09 职场文书
《故乡》教学反思
2014/04/10 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
三八妇女节标语
2014/10/09 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android