简单介绍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的PIL模块来进行图片对比

    使用Python的PIL模块来进行图片对比

    这篇文章主要介绍了使用Python的PIL模块来进行图片对比的方法,搜索引擎最基本的图片搜索也是利用图片颜色值的对比来实现的,需要的朋友可以参考下
    2016-02-02
  • tensorboard 可以显示graph,却不能显示scalar的解决方式

    tensorboard 可以显示graph,却不能显示scalar的解决方式

    今天小编就为大家分享一篇tensorboard 可以显示graph,却不能显示scalar的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python之pygame模块实现飞机大战完整代码

    python之pygame模块实现飞机大战完整代码

    这篇文章主要为大家详细介绍了python之pygame模块实现飞机大战完整代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 使用Python函数进行模块化的实现

    使用Python函数进行模块化的实现

    这篇文章主要介绍了使用Python函数进行模块化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python打开文件,将list、numpy数组内容写入txt文件中的方法

    Python打开文件,将list、numpy数组内容写入txt文件中的方法

    今天小编就为大家分享一篇Python打开文件,将list、numpy数组内容写入txt文件中的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 对Pytorch中Tensor的各种池化操作解析

    对Pytorch中Tensor的各种池化操作解析

    今天小编就为大家一篇对Pytorch中Tensor的各种池化操作解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • django使用JWT保存用户登录信息

    django使用JWT保存用户登录信息

    这篇文章主要介绍了Django使用jwt获取用户信息的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • python 定时器,实现每天凌晨3点执行的方法

    python 定时器,实现每天凌晨3点执行的方法

    今天小编就为大家分享一篇python 定时器,实现每天凌晨3点执行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python实现一次创建多级目录的方法

    python实现一次创建多级目录的方法

    这篇文章主要介绍了python实现一次创建多级目录的方法,涉及Python中os模块makedirs方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • python 如何设置守护进程

    python 如何设置守护进程

    这篇文章主要介绍了python 如何设置守护进程,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-10-10

最新评论