wsgi
wsgi是最基础的接口实现方式,
1 | def application(environ, start_response): |
上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
environ:一个包含所有HTTP请求信息的dict对象;
start_response:一个发送HTTP响应的函数。
运行wsgi服务器,server.py
1
2
3
4
5
6
7
8
9
10
11# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 开始监听HTTP请求:
httpd.serve_forever()
但是维护起来太蛋疼了,我们需要引入web服务框架
有了Web框架,我们在编写Web应用时,注意力就从WSGI处理函数转移到URL+对应的处理函数,这样,编写Web App就更加简单了。
Flask:精简型web框架
Django:全能型Web框架;
web.py:一个小巧的Web框架;
Bottle:和Flask类似的Web框架;
Tornado:Facebook的开源异步Web框架。
模板
协程
跟c#的协程一样,一种子程序可以中断的机制。
协程的优点:
- 协程跟多线程比,没有线程切换的开销,协程只有一个线程。
- 其次,协程最大的优势是不需要多线程的锁机制。
所以在多核CPU的逻辑是,多进程+协程。
Python对协程的支持还非常有限,用在generator中的yield可以一定程度上实现协程。虽然支持不完全,但已经可以发挥相当大的威力了。
还记得我们学习生成器时(generator),使用的yield
关键字吗,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
以下举例,利用协程实现,无锁状态下的生产者,消费者1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import time
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
time.sleep(1)
r = '200 OK'
def produce(c):
c.next()
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
if __name__=='__main__':
c = consumer()
produce(c)
gevent
Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。