简单介绍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展示动态规则法用以解决重叠子问题的示例
Apr 02 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
django如何连接已存在数据的数据库
Aug 14 Python
对python多线程与global变量详解
Nov 09 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
pandas如何处理缺失值
Jul 31 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
详解Python3中的 input() 函数
Mar 18 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
在python image 中实现安装中文字体
May 16 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
Yii中的cookie的发送和读取
2016/07/27 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
PHP中list方法用法示例
2016/12/01 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
javascript中的对象创建 实例附注释
2011/02/08 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
如何提高数据访问速度
2016/12/26 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
python之Socket网络编程详解
2016/09/29 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
电大本科自我鉴定
2014/02/05 职场文书
主管会计岗位职责
2014/03/13 职场文书
五分钟演讲稿
2014/04/30 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
导游词之日本富士山
2020/01/06 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android