标签:linux python socket django web server
我们知道传统的web server,一个进程打开socket,监听,来了请求生成新的进程(或线程、或阻塞)进行响应,本身还在继续监听。这是看过unix网络编程的大部分人所接触到的网络模型。然而,unix实在太老,网络需求在近些年发生了巨大的变化,最重要的就是对并发性的要求。
并发性的要求的提高,让本机的web server的架构也发生了变化,并且对本机这个词语也发生了不同的需求。因为server的请求可能不是一台机器处理的来的,那么又需要解决的一个问题是多个server机器的协作同步问题了。
首先是本机的变化。本机的变化有两个:并发性增加和快速开发的需求增加。我们的例子都以python作为例子。因为由于对快速开发迭代的的要求,C++等虽然性能好,但是变化速度慢,因此目前大部分网络系统后端都是用python做的,等到稳定后再切到高性能的C++或C或go后台。可惜的是互联网一直不太稳定。。。
传统的web server的模型上面说过了,如果来上百万的访问,岂不是要生成上百万个进程?(linux下线程也是进程,占用pid),并且进程管理着实耗费系统资源,这就导致了:无论硬件再怎么强大,也迟早会被并发的损耗耗尽。为了解决这个问题,应用了纤程(协程)的概念。进程本身是操作系统为用户提供的调度实体,具体的调度由操作系统完成。而协程是应用程序自己在自己的单个进程中实现的伪进程,多个协程就是多个代码的执行路径,协程的调度由应用程序自己完成(目前的一般做法是各个协程本身自己让出执行权,例如使用yield关键字)。如此就在一个操作系统的进程内模拟出了多个独立的并行的执行单位,并且协程之间的通信又特别简单(因为本来是一个进程,协程在进程看来就相当于进程内部的函数跳动和调用)。这个机制可以极大的解决单机的并发性需求。
python语言中提供了实现协程的关键字:yield。但是这不是协程的完整实现,然而pytho的好处是缺什么可以用模块实现来补充。利用yield关键字,python实现了两个比较出名的协程模块greenlet和stackless,两个的主要区别是stackless是自动的进行协程间调度,而greenlet需要各个协程手动的让出执行权利。各有优势,但是显然在精细化控制上greenlet的简单设计与python的yield关键字不谋而合,给用户提供了更高的权利(但是也需要付出更多的代码)。
又有人在greenlet之上封装实现了gevent。是基于协程的网络库。由于是基于协程的,所以这个网络库的最大特点就是高度并发。什么是网络库呢?无非就是封装了socket使用和进程线程模型。例如你可以动态的开多个进程(线程),每个都跑greenlet协程,也可以直接做个线程池。greenlet定义了协程和切换的方法,但是没有规定怎么切换,在socket下,很容易阻塞,gevent就预定了切换的情况。也就是说,在协程使用上,greenlet是方法,gevent实现了策略。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Python web世界观——web架构概览(适合传统程序员)
标签:linux python socket django web server
原文地址:http://blog.csdn.net/ljy1988123/article/details/49201817