python

Gevent学习记录1

Roy
关于Gevent出现URLError: <urlopen error [Errno 66] unknown>错误: 学习的过程中,有些网址始终出现上面提示的那个错误,但用浏览器访问确实是正常的。 有网友提示说把gevent.monkey.patch_all(dns=false),经我实验后发现,这么改过后有些网址确实变得正常了,但有些网址却出现了其它比如time out、Network is unreachable等错误。

python异步任务队列、消息队列

Roy

提起gevent,就不得不提起greenlet。按照官方解释greenlet是轻量级的并行编程,而gevent呢,就是利用greenlet实现的基于协程的python的网络library。

官方文档:http://www.gevent.org/contents.html

说说协程,进程和线程大家平时了解的都比较多,而协程算是一种轻量级进程,但又不能叫进程,因为操作系统并不知道它的存在。什么意思呢,就是说,协程像是一种在程序级别来模拟系统级别的进程,由于是单进程,并且少了上下文切换,于是相对来说系统消耗很少,而且网上的各种测试也表明,协程确实拥有惊人的速度。并且在实现过程中,协程可以用以前同步思路的写法,而运行起来确是异步的,也确实很有意思。话说有一种说法就是说进化历程是多进程->多线程->异步->协程,暂且不论说的对不对,单从诸多赞誉来看,协程还是有必要理解一下的。

GIL,线程,协程

Roy
并行与并发 并发:一个CUP运行多个程序,就好像一个人吃三个馒头。 并行:一个程序同一时刻运行在多个CUP上,就好像三个人吃一个馒头。 再从网上借用个例子: “并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。明白了这个区别后再往下看。 GIL 由于新的项目可能需要进行py线程级别的操作,便开始学习了python线程的相关知识。但是学习的过程中发现,由于py中GIL(解释器全局锁)的存在,线程对于py来说似乎是一个比较鸡肋的东西。 关于GIL这篇文章解释的很好:http://www.oschina.net/translate/pythons-hardest-problem?p=2#comments 既然如此,为什么py中不取消GIL呢?这篇文章给予了一定程度的解答:http://www.cnblogs.com/mindsbook/archive/2009/10/15/thread-safety-and-GIL.html

装饰器

Roy
装饰器的基础是 python 中函数也是对象,可以进行传递,可以在函数内部定义新的函数(函数内部的函数无法被单独调用)。 http://www.codecho.com/understanding-python-decorators/ # 装饰器makebold用于转换为粗体 def makebold(fn): # 结果返回该函数 def wrapper(): # 插入一些执行前后的代码 return "<b>" + fn() + "</b>" return wrapper # 装饰器makeitalic用于转换为斜体 def makeitalic(fn): # 结果返回该函数 def wrapper(): # 插入一些执行前后的代码 return "<i>" + fn() + "</i>" return wrapper @makebold @makeitalic #注意顺序很重要!!!!! def say(): return "hello" print say() #输出: <b><i>hello</i></b> # 等同于 def say(): return "hello" say = makebold(makeitalic(say)) print say() #输出: <b><i>hello</i></b>

django-groundwork个人1.5.3修改版

Roy
django-groundwork,它不实现具体的功能,而是扩展了manage.py 的命令,使得通过命令行可以生成一些代码/文件。根据你的模型自动生成模板、view、url等。 将下载好的groundwork放到与APP同级的目录,在setting.py 中添加'django-groundwork'。 网上流传的都不太适合我使用的1.5.3版本,所以个人对其进行了小修改。 groundwork.py: from django.core.management.base import BaseCommand, CommandError from django.

django版本更换

Roy
如果你打算从过去的一个版本升级Django, 你需要先删除老版本的Django之后, 再安装新的版本. 如果你是通过执行命令 setup.py install 来安装 Django, 卸载的方法很简单, 只要在site-packages 目录下删除 django 目录就可以了.