coroutine也是一种并发模型,但不同于thread和callback,它的所有task都是可以在一个线程里面执行,然后可以通过在一个task里面主动放弃执行来切换到另一个task执行,它的调度是程序级的,不像thread是系统级的调度。gevent就是一个基于coroutine的python网络开发框架,不像twisted那样集成了很多库和协议,gevent非常精简,当然文档也很少,在性能上的话,看了PyCon上的视频,对比了twisted和其他的几个库,在内存的性能上非常地优秀,代码简洁而且也支持多核。 做了个相当简单的ChatService,有登录、群发消息、退出这3个消息,协议就是用简单的json了,有时间再试试xmpp看看。”monkey.patch_all()” 这个调用就把python原生的一些socket对象和方法替换成非阻塞的异步调用,写起来感觉还是很方便。
url映射是目前流行的框架都提供的基本功能,参考了django的url映射的源码,用python实现url映射的主要逻辑还是比较简单的。主要是由两个部分组成: 将处理函数的命名空间解析成模块,使用__import__,导入模块,获取处理函数的引用(见get_callable()); 匹配访问路径,提取参数,使用正则表达式进行匹配。 # add url_base as namespace to handlers in url_patterns def include(url_base, url_patterns): for index, src_pattern in enumerate(url_patterns): pattern = list(src_pattern) pattern[1] = “%s.%s” % (url_base, pattern[1]) url_patterns[index] = tuple(pattern) return url_patterns # get module name and func … Continue reading →
初次使用logging模块觉得有点诡异,涉及到Logger、Handler、Level等概念,看代码最实际了: import logging import sys logger = logging.getLogger(“endlesscode”) formatter = logging.Formatter(‘%(name)-12s %(asctime)s %(levelname)-8s %(message)s’, ‘%a, %d %b %Y %H:%M:%S’,) file_handler = logging.FileHandler(“test.log”) file_handler.setFormatter(formatter) stream_handler = logging.StreamHandler(sys.stderr) logger.addHandler(file_handler) logger.addHandler(stream_handler) #logger.setLevel(logging.ERROR) logger.error(“fuckgfw”) logger.removeHandler(stream_handler) logger.error(“fuckgov”) 文档上已经说明得很清楚了,有几个比较特别的地方: