简单介绍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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
在Python中调用ggplot的三种方法
Apr 08 Python
Python实现视频下载功能
Mar 14 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
Python实现非正太分布的异常值检测方式
Dec 09 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
在python3中实现更新界面
Feb 21 Python
Python可视化神器pyecharts绘制水球图
Jul 07 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
咖啡与牛奶
2021/03/03 冲泡冲煮
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
php图片裁剪函数
2018/10/31 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
WEB前端设计师常用工具集锦
2014/12/09 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
js中bool值的转换及“&amp;&amp;”、“||”、 “!!”详解
2017/12/21 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python 对象中的数据类型
2017/05/13 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Python进行特征提取的示例代码
2020/10/15 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
拾金不昧的表扬信
2014/01/16 职场文书
搞笑获奖感言
2014/01/30 职场文书
电视节目策划方案
2014/05/16 职场文书
初婚未育证明样本
2014/10/24 职场文书
政协常委会议主持词
2015/07/03 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记