编程技术

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 目录就可以了.

python中如何自定义解析域名

Roy
最近要进行某网站的信息抓取工作,不过这个网站作出了一些限制:如果某IP过于频繁的访问则会把这个IP列入黑名单。 不过这个网站使用了CDN技术进行全球加速,那么访问时候只要在请求头中指定HOST,url中指定加速IP即可一定程度上缓解被封问题。 在网上找到一篇有关文章节选如下(原文链接http://www.hack0nair.me/?p=615): 第一种解决方案是利用http数据包头部中的“Host”属性。 在发送HTTP请求的时候,数据包的头部总是会带上各种各样的属性,比如Data、Referer、Cookie等。(Quick reference to HTTP headers) 其中的Host属性是指,当前访问资源对应的主机名和端口号。