Web服务器网关接口实现原理分析

Web服务器网关接口(WSGI),又叫Python Web服务器网关接口(Python Web Server Gateway Interface),是用来描述web服务器与网站应用程序通信和应用程序如何处理请求的规范。它的第一个版本于2003年发布,从那时起,wsgi就成为了python web应用的开发标准,目前最新的版本是v1.0.1,于2010年9月26日发布。

使用python做过web开发的对下面的例子应该非常熟悉,运行之后访问则会显示出Hello,web!

from wsgiref.simple_server import make_server

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'

httpd = make_server('', 80, application)
print "Serving HTTP on port 80..."

httpd.serve_forever()

在上面的例子中,几行代码就可以搭建出一个HTTP服务器,并没有使用像apache,nginx一样的专用web服务器,而是使用wsgiref中的模块。对于这个服务来说,application是用户层的代码,而wsgi对内提供应用接口,对外充当web服务器。
WSGI流程 …阅读更多>>

协程与多任务调度

在计算机科学中,多任务(multitasking)是指在同一个时间段内运行多个任务,现代计算机作为一个复杂的系统,运行的任务往往不止一个,所以多任务调度对于计算机来说尤为重要。现阶段多任务调度主要分为抢占式多任务和协作式多任务,抢占式多任务由操作系统决定进程的调度方案,而协作式多任务是当前任务主动放弃执行后,下一个任务继续进行。由于协作式任务管理受恶意程序的威胁更大,现阶段几乎所有的计算机都采用抢占式多任务管理。
多任务处理
现阶段,主要靠多进程或多线程的方式来实现多任务:

#include <stdio .h>
#include <unistd .h>

int main()
{
	pid_t pid;
	pid = fork();

	if(pid < 0){
		printf("Fork Error!\n");
	}else if (pid > 0){
		printf("This is the parent Process! Process Id is %d, Child id is %d\n",getpid(),pid);
		int i = 0;
		while(i < 10){
			printf("This is parent Process output of i %d!\n",i);
			i++;
		}
	}else if (pid == 0){
		printf("This is the child Process! Process Id is %d, parent id is %d\n",getpid(),getppid());
		int j = 0;
		while(j < 10){
			printf("This is child Process output of j %d\n",j);
			j++;
		}
	}
	return 0;
}

...阅读更多>>

Python UnicodeEncodeError问题的分析和思考

最近在利用Python获取网络数据的过程中出现一个问题,系统会时不时抛出UnicodeEncodeError的错误,并停止运行,严重影响了其它功能的运行。程序类似下面这样:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2
print urllib2.urlopen("http://www.example.com/examplepath").read()

报错信息如下: UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u2022′ in position XXXX: illegal multibyte sequence

经过检查,发现是因为获取的远程文件中含有”·”这个字符,官方解释是“着重号(BULLET)”,其unicode编码是u+2022,其它关于这个符号的介绍,可以点击这里。也就是说,因为获取到的远程内容中含有着重号这个字符,所以导致程序出现UnicodeEncodeError。 …阅读更多>>

协程与yield

协程,又称微线程或纤程,是一个比进程和线程更加轻量级的解决方案,现代编程语言基本上都支持。那么协程究竟有什么特点,它是如何运作的呢?
协程与yield
进程和线程之间的关系我在这篇文章中做了一下比较分析。线程是程序的运行流,所有指令从头到尾按顺序一一执行,进程则是包含线程的容器。在单核CPU中,永远只有一条线程在运行,当然也只可能有一个进程运行,由操作系统内核负责进程和线程的切换。而协程是属于用户空间的,操作系统对其一无所知,由用户自己去做调度。显然用户自己调度比通过使用一个中断让操作系统调度会快很多,这就是协程快的秘诀了。 …阅读更多>>

Python异常详解

异常(exceptions)是Python中一种非常重要的类型,它和语法错误不同,是在程序运行期间引发的错误。Python中内置了很多异常,如IOError,NameError,KeyboardInterrupt等,更多的异常可以点击这里
异常的意义在于提供一种更加优雅的运行方式,例如用Python编写一个计算器,如果用户输入不能计算的对象,则可以抛出异常,并进行处理, 如下:

while True:
    try:
        x= int(input('Please In enter A number:'))
        print "Your Input is %s"%x
        break
    except Exception,e:
        print e

…阅读更多>>