1. 结语
1.1. python协程的现状
有很长一段时间,大多数Python高手开发网络应用时喜欢使用异步编程,但是总会遇到一个问题——挑选的库之间不兼容。 Twisted 是 Node.js 的灵感来源之一;而在 Python 中,Tornado 拥护使用协程做面向事件编程;同时第三方的协程库gevent
,eventlet
,greenlet
等由于简单好用也长期存在并发展迅速.直到python3.5之前我都是gevent的忠实用户.
在 JavaScript 社区里还有争论,有些人推崇使用简单的回调,而有些人提倡使用与回调处于竞争地位的各种高层抽象方式.Node.js早期版本的API使用的是Promise
对象(类似于Python
中的期物),但是后来Ryan Dahl
决定统一只用回调.
Python社区的争论已经结束:
asyncio
包添加到标准库中之后,协程和期物被确定为符合 Python 风格的异步代码编写方式。此外,asyncio
包为异步期物和事件循环定义了标准接口,为二者提供了实现参考。 正如"Python 之禅"所说: 肯定有一种——通常也是唯一一种——最佳的解决方案
python的协程工具一开始并不易于理解,不过一段时间之后我理解了。 更重要的是,设计asyncio
包时考虑到了使用外部包替换自身的事件循环,因此才有 asyncio.get_event_loop 和 set_event_loop 函数——二者是抽象的事件循环策略. Tornado 已经有实现 asyncio.AbstractEventLoop 接口的类——AsyncIOMainLoop,因此在同一个事件循环中可以使用这两 个库运行异步代码。此外,Quamash项目也很有趣,它把asyncio包集成到Qt
事件循环中,以便使用PyQt
或PySide
开发GUI应用.我只是举两个例子,说明asyncio
包能把面向事件的包集成在一起。
智能的HTTP
客户端,例如单页Web
应用(如Gmail
)或智能手机应用,需要快速、轻量级的响应和推送更新。鉴于这样的需求,服务器端最好使用异步框架,不要使用传统的Web框架(如Django
).传统框架的目的是渲染完整的 HTML 网页,而且不支持异步访问数据库。
WebSockets
协议的作用是为始终连接的客户端(例如游戏和流式应用)提供实时更新,因此,高并发的异步服务器要不间断地与成百上千个客户端交互.asyncio
包的 架构能很好地支持WebSockets
,而且至少有两个库已经在asyncio
包的基础上实现了WebSockets
协议:
'实时 Web'的整体发展趋势迅猛,这是Node.js
需求量不断攀升的主要因素,也是 Python 生态系统积极向asyncio
靠拢的重要原因.不过,要做的事还有很多.为了便于入门,我们要在标准库中提供异步HTTP服务器和客户端API,异步数据库API 3.0,以及使用asyncio
包构建的新数据库驱动.
1.2. Signal模块定义的Unix信号量
Signal模块中定义的常量 | 说明 |
---|---|
signal.SIGHUP | 连接挂断; |
signal.SIGILL | 非法指令; |
signal.SIGINT | 终止进程(ctrl+c); |
signal.SIGTSTP | 暂停进程(ctrl+z); |
signal.SIGKILL | 杀死进程(此信号不能被捕获或忽略); |
signal.SIGQUIT | 终端退出; |
signal.SIGTERM | 终止信号,软件终止信号; |
signal.SIGALRM | 闹钟信号,由signal.alarm()发起; |
signal.SIGCONT | 继续执行暂停进程; |
还没有评论,来说两句吧...