上周末,在上海、北京两地同时举行了 PyCon China 2012 大会,且在多地进行了直播。本次会议由各地 GDG 、 TopGeek 和 CPyUG 多个社区联合举办,上海站作为主会场,为期两天的会议内容非常丰富。
正式开场前,TopGeek 创始人之一陈世欣介绍了赞助商、主办方以及各地的志愿者,概述了两天的会议内容,同时还向大家展示了 Python 在全球范围内的发展情况,以及社区情况,尤其是华蠎的订阅人数即将超过 10000,这可能是 Google Goups 上最大的技术社区。随后,播放了两段简短的视频,一段是来自居住在日本的华人蟒友张若愚(《Python 科学计算》的作者)专门为大会录制的视频,另一段是 Python 之父 Guido 在今年 PyCon US 大会上的演讲。
本次大会与去年的大会有很多相似之处,例如正式演讲都由 Python 社区中著名的“沈游侠”开场,本次沈崴为大家带来的《Python 产品构建与发布指南》介绍了如何更好地用Python 进行跨平台开发。有网友评价沈游侠的演讲点子很新,内容也很有料,就是难度有点大。
沈崴建议进行跨平台开发,可以先在Linux/Unix 上进行开发,哪怕开发的是Windows 上的程序,因为通常前者环境下开发的东西天然就是跨平台的。现场两位游戏方面的演讲嘉宾也分别表示自己正在使用或者知道跨平台方面的内容。他对比了Unix 和Windows 下一个完整的应用的目录结构,指出本次分享的内容主要关注于可执行文件和库。一般情况下,Windows 并不认为Python 程序是可执行的,因此就有了编译为“可执行程序”的问题,比如很常见的py2exe,还有目前非常流行的 Cython 和 PyPy 。
除了将 Python 程序编译为“可执行程序”,还可以使用 Cython,将 Python 编译为库(so 或 dll),PyPy 也有同样的功能,只是 PyPy 目前缺乏对多个 Entry Point 的支持。但是,目前不建议使用 Python 进行嵌入式开发。Python 程序也可作为服务运行在后台,Unix 下有各种方式可以将程序放到后台作为 Deamon 运行;Windows 下可以使用 pywin32,或者索性把程序放到托盘(Systray)里,PySide 就能通过少量代码实现该功能。
在程序界面方面,Unix 程序员倾向于先把东西做成库,然后变成 CLI(命令行方式),最后用一个 GUI 通过 Pipe 或 Socket 将它封装一下。而 Windows 程序员通常一开始就会做一个 GUI 的程序。Python 中有不少 GUI 库可供选择,比如 tk、gtk、PySide(也就是 QT)、wxPython 和 PyGame。除了这些传统的 GUI 库,还可以用 Web 的方式来开发一个 GUI 程序,先写一个 Web 服务器,再写一个 GUI 程序,其中嵌入 WebKit,由它去访问网页。可以通过 OnBeforeNavigate 截取用户的 URL 跳转,甚至直接用 AJAX 进行控制,而最简单的方式是让 JavaScript 和 Python 直接互相调用。沈崴讲到了他主导的两个开源项目,仍在开发中的 Liubao 可以方便地实现 JavaScript 和 Python 的相互调用,而著名的 Eurasia 也即将发布 3.2 版本,比 3.1 增加了 File IO、Pipe 等方面的内容。
随后,土豆网李小红的演讲《让程序运行更快》也与去年大会上黄冬的演讲类似,技术含量十足,只是内容与 Python 关系不是很大,但还是让听众大呼过瘾。他先从 Varnish 比 Squid 快说起,详细对比了 Squid 和 Varnish 在各种命中和不命中时的工作情况。Squid 在诞生之时,OS 还没有 VM 管理功能,所以自己做了一套管理机制,与现代 OS 的 VM 管理有冲突;而 Varnish 则利用了现代 OS 自身的管理机制。Varnish 更快的原因主要在于:
- 多线程,有效利用多核和 CPU 资源
- 内存访问和复制次数少
- 处理请求系统调用次数少
- 有效利用操作系统虚拟内存
有这样的效果,除了硬件的发展,很大程度上也与现代 OS 的进步有关:
- 从 poll 到 epoll
- 零内存复制的 sendfile 接口
- gather io 减少系统调用——readv、writev
- 中断 bottom half 处理演进
- 操作系统 page cache
虽然李小红本人并不从事 Python 开发,但是土豆在日常工作的很多地方都用到了 Python。比如土豆的用户体验分析,短时间内进行百 G 日志分析,就结合了 Shell/Python/awk/c,每次针对半个小时的日志分析,综合了管道、临时文件等众多技术。他为大家介绍了 Python 的 Dictionary 实现,使用 Open Addressing 解决 Hash 冲突;结构体中自带 8 个桶的小 Hash 表;保持最多 80 个不同的 Dictionary,这加快了 Dictionary 的生成和释放;删除元素时不会缩减桶数量,减少内存访问次数。针对 Python 解释器,由于存在大锁、多线程效果差的问题,可以考虑向 Java VM 或者 Linux Kernel 学习。他建议大家在优化程序时能抱着这样的想法:
- 多度量,多思考
- 少改动
- 找到改动的支点(不到 20% 的努力能带来 80% 的效果)
本次大会还出现了外国演讲嘉宾的身影,比如 OpenERP 专家 Eric CAUDAL 先生,他为大家介绍了最新的 OpenERP 7 中的众多特性。由于在做的听众对 OpenERP 的了解不多,所以他先简单介绍了一下 OpenERP——一款非常专业的用 Python 开发的开源ERP 软件。OpenERP 目前的发展势头良好,且新版本带来了很多出众的功能,CAUDAL 先生的演示非常吸引人。一些嘉宾表示,虽然 OpenERP 和以前的 Plone 有很多相似之处,但它让人眼前一亮,这让人们对 Python 开发复杂系统更有信心了。 OpenERP 不仅是个 ERP 软件,也是一套值得学习的框架,新版本在框架方面也做了一些改动,第二天的《人人可以化半小时开发一个全功能 OpenERP 模块》也很好地体现了这点。
既然是 Python 爱好者的大会,自然少不了纯技术的话题,许智翔的《元编程在 Redis ORM 中的应用》就 Hack 味十足,从何为元编程入手,层层深入,最后讲到了其在 redisobj ORM 框架中的应用,技术深度让人折服。无独有偶,上届的演讲嘉宾潘俊勇本次也带来了一个与 Redis 相关的主题,可见在 Python 项目中使用 Redis 还是很普遍的。
游戏是每次 PyCon China 大会中都少不了的内容,除了老朋友林伟、赖勇浩和王健纷纷带来了自己的主题,还有很多新朋友介绍了自己在 Python 游戏开发方面的经验。本次的游戏主题包括:
评论