当前位置:天才代写 > tutorial > Python教程 > 高机能python编程之协程(stackless)

高机能python编程之协程(stackless)

2017-11-02 08:00 星期四 所属: Python教程 浏览:47

我们都知道并发(不是并行)编程今朝有四种方法,多历程,多线程,异步,和协程。

多历程编程在python中有雷同C的os.fork,虽然尚有更高层封装的multiprocessing尺度库,在之前写过的python高可用措施设计要领http://www.cnblogs.com/hymenz/p/3488837.html中提供了雷同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等的实现。

 

    关键字:


天才代写-代写联系方式