wsgi+webob+routes学习笔记-初学篇(中)

来源:互联网 发布:孙悟空配音软件 编辑:程序博客网 时间:2024/04/29 04:27

接上文:

可以看到wsgi已经在8090端口上建立了,用Rest client发个消息看下,可以看到已经收到了响应“Hello, World! I am sxmatch”

在以上程序中:方法def myapp(env, start_response)就是用户自己的应用,起入参是wsgi规定好的,env为字典,start_response是个回调函数对象。在application中调用了这个start_response(status,response_headers).

可以说这个简单的server就是wsgi服务的骨架,如果在server和app之间再加入一些管道,就成了middleware,这不就和openstack的消息流处理过程一致了吗?

4     使用协程启动的wsgi服务

上文介绍的wsgi服务是直接使用wsgi.server去启动,进一步我们可以利用evenlet中协程去启动一个wsgi服务,在openstack的wsgi.py的Server类中就是使用这种方式。对于协程可以把它大致可以理解成允许子程序可以多次暂停和恢复执行,是实现多任务的一种有效手段。推测openstack中每个application都是通过一个协程来启动的,对于协程还需进一步的学习。基于以上,我们可以将第一段程序进行改造:

__author__= 'sxmatch'

"""useeventlet to start wsgi server"""

importwebob

importeventlet

fromeventlet import wsgi

fromwebob import Request

 

defmyapp(env, start_response):

    status = "200 OK"

    response_headers = [('Content-Type','text/plain')]

    start_response(status, response_headers)

    return ['Hello, World!\r\n']

 

 

defstart():

    print "start wsgi server"

   wsgi.server(eventlet.listen(('192.168.82.191', 8090)), myapp)

 

wsgi_server= eventlet.spawn(start)

wsgi_server.wait()

其中start函数是要启动的wsgi服务,而evenlet.spawn(start)正是启动一个协程去调用start函数,其返回结果是一个协程对象,这里有个问题需要提一下,如果只执行wsgi_server =eventlet.spawn(start)这句其实并没有真正调用start()方法,只有最后调用该对象的wait()方法后,才能真正执行start函数。Openstack中server类中的wait方法其实就是调用了协程的wait方法。服务启动及响应截图如下:


原创粉丝点击