介绍gevent是一个使用完全同步编程模型的可扩展的异步I/O框架。 让我们先来看一些示例,这里有一个 echo 服务器:
在这个例子中,我们并行发出100个web请求:
有些奇怪monkey.patch_all()的调用?不用担心,这可不像你每天打的猴子补丁(译注:monkey patching,即动态修改执行代码)。这仅仅是Python发行版恰好要打的一组猴子补丁。 最后一个例子是一个聊天服务器:
够简单吧?让我们看看用gevent为什么要这样写。 同步 I/O 同步I/O是指每个I/O操作被允许阻塞,直到它完成。
为了在同一时间扩展用户规模,我们需要的线程和进程。每个线程或进程被允许单独阻塞等待I/O操作。因为我们有完整的并发性,这阻塞不影响其他操作;从每个线程/进程的角度看,世界将停止直到操作完成。当结果准备就绪时,操作系统会恢复线程/进程。
线程的缺点:糟糕的性能。请参阅 Dave Beazley 的 GIL 笔记。还有高内存使用。线程在Linux中分配堆栈内存(请参阅ulimit -s)。这是对 Python 是没有用的 —— 相对较少线程就会让你耗尽内存。 进程的缺点:没有共享的内存空间。还有高内存使用,因为堆栈分配和写入时复制(译注:copy-on-write)。线程在Linux中就像一种特殊的进程;内核结构都或多或少是相同的。 |