Python之gevent使用

Greenlets

在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。在任何时刻,只有一个协程在运行。 在gevent里面,上下文切换是通过yielding来完成的. 当我们在受限于网络或IO的函数中使用gevent,这些函数会被协作式的调度, gevent的真正能力会得到发挥。Gevent处理了所有的细节, 来保证你的网络库会在可能的时候,隐式交出greenlet上下文的执行权。
greenlet具有确定性。在相同配置相同输入的情况下,它们总是 会产生相同的输出。
即使gevent通常带有确定性,当开始与如socket或文件等外部服务交互时, 不确定性也可能溜进你的程序中。因此尽管gevent线程是一种“确定的并发”形式, 使用它仍然可能会遇到像使用POSIX线程或进程时遇到的那些问题。涉及并发长期存在的问题就是竞争条件(race condition)。简单来说, 当两个并发线程/进程都依赖于某个共享资源同时都尝试去修改它的时候, 就会出现竞争条件。这会导致资源修改的结果状态依赖于时间和执行顺序。 这是个问题,我们一般会做很多努力尝试避免竞争条件, 因为它会导致整个程序行为变得不确定。最好的办法是始终避免所有全局的状态。全局状态和导入时(import-time)副作用总是会 反咬你一口!

阅读全文

Node最佳实践1

编码规范

回调惯例

模块应该公开一个错误优先(error-first)的回调接口。
就像下面这样:

1
2
3
4
5
6
7
8
module.exports = function (dragonName, callback) {
// 这里做一些处理工作
var dragon = createDragon(dragonName);
// 注意, callback第一个参数是 error
// 这里传入null
// 如果出错则传入错误信息
return callback(null, dragon);
}

阅读全文

Node笔记3

更有用的场景

服务器,请求路由以及请求处理程序都已经完成了,下面让我们按照此前的用例给网站添加交互:用户选择一个文件,上传该文件,然后在浏览器中看到上传的文件。 为了保持简单,我们假设用户只会上传图片,然后我们应用将该图片显示到浏览器中。

阅读全文

Python之coroutine

Coroutine概念

Coroutine,又称作协程。即协同运行的例程,它是比是线程(thread)更细量级的用户态线程.特点是允许用户的主动调用和主动退出,挂起当前的例程然后返回值或去执行其他任务,接着返回原来停下的点继续执行。

阅读全文

Node笔记2

关于函数式编程

将函数作为参数传递并不仅仅出于技术上的考量。对软件设计来说,这其实是个哲学问题。

想想这样的场景:在index文件中,我们可以将router对象传递进去,服务器随后可以调用这个对象的route函数。就像这样,我们传递一个东西,然后服务器利用这个东西来完成一些事。然后,那个叫路由的东西,能帮我把这个路由一下吗?但是服务器其实不需要这样的东西。它只需要把事情做完就行,其实为了把事情做完,你根本不需要东西,你需要的是动作。

阅读全文