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

 更新时间:2015年05月04日 10:12:37   投稿:goldensun  
这篇文章主要介绍了简单介绍Python中利用生成器实现的并发编程,使用yield生成器函数进行多进程编程是Python学习进阶当中的重要知识,需要的朋友可以参考下

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

多进程编程在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 lxml模块安装教程

    Python lxml模块安装教程

    这篇文章主要介绍了Python lxml模块安装教程,本文分别讲解了Windows系统和Linux系统下的安装教程,需要的朋友可以参考下
    2015-06-06
  • Python字符串对齐方法使用(ljust()、rjust()和center())

    Python字符串对齐方法使用(ljust()、rjust()和center())

    这篇文章主要介绍了Python字符串对齐方法使用(ljust()、rjust()和center()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python中运维神器Psutil的用法详解

    Python中运维神器Psutil的用法详解

    Python的开源库psutil为我们提供了一个强大的工具,能够轻松获取和分析系统利用率的信息,下面就跟随小编一起深入了解一下它的具体使用吧
    2025-02-02
  • Python 脚本获取ES 存储容量的实例

    Python 脚本获取ES 存储容量的实例

    今天小编就为大家分享一篇Python 脚本获取ES 存储容量的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python3.5内置模块之time与datetime模块用法实例分析

    Python3.5内置模块之time与datetime模块用法实例分析

    这篇文章主要介绍了Python3.5内置模块之time与datetime模块用法,结合实例形式分析了Python3.5 time与datetime模块日期时间相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • python中的随机数种子seed()用法说明

    python中的随机数种子seed()用法说明

    这篇文章主要介绍了python中的随机数种子seed()用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • python文件写入实例分析

    python文件写入实例分析

    这篇文章主要介绍了python文件写入的用法,实例分析了Python文件写入的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 利用python设计图像加密技术(Arnold算法)

    利用python设计图像加密技术(Arnold算法)

    这篇文章主要介绍了利用python设计图像加密技术(Arnold算法),本文将借助Arnold置乱法,讲解如何用python从头至尾设计出一套图像加密算法,需要的小伙伴可以才参考一下
    2022-03-03
  • Python分支语句常见的使用方法

    Python分支语句常见的使用方法

    这篇文章主要介绍了Python分支语句常见的使用方法,Python分支语句,也称为选择语句,体现了程序的选择结构,即对应不同的场景,选择不同的处理方式,具体常见的用法需要的朋友可参考下面文章内容
    2022-06-06
  • python进程池的简单实现

    python进程池的简单实现

    本文主要介绍了python进程池的简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论