好贷网好贷款

进程,线程,协程

发布时间:2016-12-4 14:04:47 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"进程,线程,协程",主要涉及到进程,线程,协程方面的内容,对于进程,线程,协程感兴趣的同学可以参考一下。

首先这些东西都是为了”并发“, 也就是”同一时间“执行多个任务.  不过这三者在实现这一目标上有不同的方法.  首先三者都构成任务(Task), 都有下面一些特征. 独立的控制流 有内部状态 可以被调度 可以同其他任务通讯  进程之间不共享任何状态,  进程的调度由操作系统完成, 进程间通讯也要通过操作系统. (共享内存, 管道等等). 进程的问题: 进程间切换开销很大, 通讯麻烦.  线程之间共享变量, 解决了通讯麻烦的问题, 但是对于变量的访问需要锁.  线程的调度主要也是有操作系统完成, 但用户程序自己有可以有一些控制(比如将自己挂起等). 线程间的切换开销比进程小了很多。 协程的调度完全由用户控制,协程间的切换开销很小, 可以不加锁的访问全局变量.  一个进程可以有多个线程, 一个线程可以有多个协程.  多进程编程在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,我们先来看一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #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异常。 通过上面的例子我们看到协程的调度对于内核来说是不可见的,协程间是协同调度的,这使得并发量在上万的时候,协程的性能是远高于线程的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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等的实现。

上一篇:
下一篇:sql_约束2

相关文章

相关评论