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

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

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

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

多进程编程在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-8import timeimport 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 stacklessimport urllib2def 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中利用生成器实现的并发编程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1202751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存