====================
使用twistd托管应用
====================
:作者: gashero
:日期: 2009-08-26
.. contents:: 目录
.. sectnum::
简介
------
系统开发中经常遇到要把应用放到daemon中运行的情况,话说这个倒是不难,有很多现成的模块可用,就算是自己写也没几行代码。但是daemon托管的同时再捕捉所有屏幕输出日志,自动切换到其他uid/gid,切换运行目录chroot等等高级功能就不那么容易自己搞定了。
而使用twisted框架的daemon托管程序twistd来执行这些任务则是轻车熟路,功能全面而且稳定可靠。
使用twistd托管应用
--------------------
使用twistd托管应用需要实现以下几个要求:
#. 启动函数非阻塞
#. 定义启动模块全局变量 `application`
第二个条件倒是相对容易实现,但是对于绝大多数框架来说,第一个条件几乎是不可能的任务。下面给出一个符合上面要求的启动脚本结构::
from twisted.internet import reactor,protocol,defer
from twisted.application import service,internet
from twisted.python import log
def main():
print 'started!'
return
if __name__=='__main__':
main()
elif __name__=='__builtin__':
main()
application=service.Application('hello')
假设如上模块叫做 ``sample.py`` ,那么可以通过如下脚本启动使其进入daemon模式运行::
twistd -y sample.py
如上启动后会自动托管屏幕输出日志。需要关闭该应用时可以用::
kill `cat twistd.pid`
对于主函数中需要阻塞的情况,也就是几乎绝大多数情况下,可以使用 `reactor.callLater()` 函数使得在启动函数中不阻塞,而在其后的主循环中阻塞的方式运行。如下(只显示启动脚本部分)::
if __name__=='__main__':
main()
elif __name__=='__builtin__':
reactor.callLater(1,main)
application=service.Application('hello')
当然,你也许想到了为什么不把 `main()` 放入线程中运行。这是因为很多框架的启动函数中同时会注册信号处理器,而这些注册行为必须要在主线程中执行。当然如果你足够幸运的话,也可以用如下的形式碰碰运气::
if __name__=='__main__':
main()
elif __name__=='__builtin__':
reactor.callInThread(main)
application=service.Application('hello')
这里建议使用twisted自带的线程管理函数,而不是自己用threading和thread模块的线程,因为后者的错误日志可能会消失的无影无踪。
好了,按照如上改造后,就可以使用twisted托管了。日志是按照不超过1MB来轮询的,在 ``twistd.log.<N>`` 中的数字N会持续增加,新日志的N比较小。建议用一个crontab来定期清理多余的日志。
控制脚本
----------
为了更方便的使用托管,还可以编写一个控制脚本实现进程的启动、退出、阻塞方式调试、日志查看等工作。内容如下,我一般叫做 ``ctlapp.sh`` ::
#! /usr/bin/env sh
MAIN_MODULE=sample.py
case $1 in
start)
PYTHONPATH=.:$PYTHONPATH twistd -y $MAIN_MODULE
;;
stop)
kill `cat twistd.pid`
;;
restart)
kill `cat twistd.pid`
sleep 1
PYTHONPATH=.:$PYTHONPATH twistd -y $MAIN_MODULE
;;
log)
tail -f twistd.log
;;
*)
echo "Usage: ./ctlapp.sh start | stop | restart | log"
;;
esac
使用该控制脚本的4个参数可以方便的控制应用。注意其中设置PYTHONPATH部分,是因为某些编译版本的twistd无法找到当前路径下的模块。
分享到:
相关推荐
文档还简要介绍了如何在Twisted程序中运行本地命令,如使用`os.system()`或`subprocess`模块。这在需要执行系统级别的操作时非常有用。 #### 九、从Web读取信息 文档中提到了如何使用Twisted从Web读取信息。这通常...
第十四部分到第十六部分转向了测试和Twisted进程守护方面的内容,包括了如何测试Twisted应用、如何使用Twisted插件系统以及如何创建一个Twisted守护进程。 第十七部分和第十八部分则探讨了构造“回调”的另一种方法...
- **使用twistd命令**:文档还介绍了如何使用twistd命令来运行Twisted应用程序,这是Twisted提供的一个强大的命令行工具,可以用来启动和管理Twisted服务。 - **组件化架构**:最后,文档讨论了如何将应用程序重构...
下面将详细介绍Twisted的核心概念、功能以及如何使用它来开发网络应用。 ### 1. 事件驱动编程 事件驱动编程是通过事件循环(Event Loop)来处理程序中的异步操作。在Twisted中,这一核心组件称为`reactor`。当一个...
这反映出Twisted在Python社区中的重要性,因为它是一个广泛使用的网络编程工具,尤其对于那些需要处理大量并发连接和长时间运行的服务来说。 Twisted是Python中的一个非阻塞I/O模型,它利用事件驱动的编程模型来...
- **Deferred用于同步环境**:这部分介绍了如何在同步环境中使用Deferred,以及这种方法的优势所在。 - **测试诗歌**:通过具体的测试案例,展示了如何使用Twisted内置的测试框架来验证程序的正确性和稳定性。 - **...
Twisted是Python编程语言中的一个开源网络框架,专注于异步编程和事件驱动的网络应用开发。这个框架在Python社区中广泛使用,特别是对于构建高性能、高并发的服务器端应用程序。标题提到"twisted适合python3.8版本...
【Twisted与异步编程入门】是一篇关于Python中Twisted框架和异步编程的教程。Twisted是一个强大的网络应用框架,特别适用于处理复杂的异步编程需求。文章首先强调了理解异步编程模型的重要性,指出只有深入理解模型...
这个"twisted例子"可能是一个从Twisted系列教程中提取的实际应用示例,旨在帮助学习者更好地理解和掌握Twisted的核心概念和用法。 在Twisted框架中,主要关注的是事件驱动的非阻塞I/O,它允许程序在等待网络操作...
这是因为Scrapy在运行过程中,会用到Twisted的异步处理能力来高效地并发请求网页,处理大量网络数据。 Twisted是一个开源的事件驱动网络编程库,用于构建高度可伸缩的网络应用。它支持多种协议,包括TCP、UDP、HTTP...
这个文件可能是用户为了在Python 3.5环境中使用Twisted而寻找的,因为它表明了对这个特定Python版本的支持。安装这个whl文件可以确保Twisted在Python 3.5环境下正确运行,从而可能解决Scrapy在该环境下的兼容性问题...
Twisted 是一个开源的事件驱动编程框架,它主要用Python语言编写,并被广泛用于...在阅读本教程时,读者应该尝试着从底层开始学习Twisted,逐步深入到框架的高级特性中去,从而能够灵活使用Twisted框架解决实际问题。
- **用途**:Deferred广泛应用于Twisted的各种场景中,比如网络请求、数据库查询等。 #### 四、Twisted应用实例 - **客户端开发**:Twisted支持快速构建高性能的网络客户端,如HTTP客户端、FTP客户端等。通过定义...
- **完全免费:** Twisted 是一个开源项目,遵循宽松的许可协议,允许开发者自由地在商业或非商业项目中使用它。 - **活跃的社区:** 有一个积极的开发者社区,可以通过邮件列表或 IRC 通道寻求技术支持和交流心得...
在实际开发中,使用 Twisted 可以创建高性能的服务器应用,例如聊天服务器、游戏服务器或分布式系统。其异步模型允许服务器处理大量并发连接,而不会被单个请求阻塞。同时,Twisted 提供了丰富的测试工具和框架,如 ...