`
gashero
  • 浏览: 962838 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用twisted中的twistd托管应用到daemon运行

阅读更多

====================
使用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无法找到当前路径下的模块。

2
0
分享到:
评论

相关推荐

    Python Twisted网络编程框架(中文)

    文档还简要介绍了如何在Twisted程序中运行本地命令,如使用`os.system()`或`subprocess`模块。这在需要执行系统级别的操作时非常有用。 #### 九、从Web读取信息 文档中提到了如何使用Twisted从Web读取信息。这通常...

    Twisted系列教程 的中文翻译

    第十四部分到第十六部分转向了测试和Twisted进程守护方面的内容,包括了如何测试Twisted应用、如何使用Twisted插件系统以及如何创建一个Twisted守护进程。 第十七部分和第十八部分则探讨了构造“回调”的另一种方法...

    twistd.pdf

    - **使用twistd命令**:文档还介绍了如何使用twistd命令来运行Twisted应用程序,这是Twisted提供的一个强大的命令行工具,可以用来启动和管理Twisted服务。 - **组件化架构**:最后,文档讨论了如何将应用程序重构...

    Twisted事件驱动网络框架

    下面将详细介绍Twisted的核心概念、功能以及如何使用它来开发网络应用。 ### 1. 事件驱动编程 事件驱动编程是通过事件循环(Event Loop)来处理程序中的异步操作。在Twisted中,这一核心组件称为`reactor`。当一个...

    Twisted-20.3.0-cp38-cp38-win_amd64.rar

    这反映出Twisted在Python社区中的重要性,因为它是一个广泛使用的网络编程工具,尤其对于那些需要处理大量并发连接和长时间运行的服务来说。 Twisted是Python中的一个非阻塞I/O模型,它利用事件驱动的编程模型来...

    Twisted系列教程.pdf

    - **Deferred用于同步环境**:这部分介绍了如何在同步环境中使用Deferred,以及这种方法的优势所在。 - **测试诗歌**:通过具体的测试案例,展示了如何使用Twisted内置的测试框架来验证程序的正确性和稳定性。 - **...

    twisted适合python3.8版本

    Twisted是Python编程语言中的一个开源网络框架,专注于异步编程和事件驱动的网络应用开发。这个框架在Python社区中广泛使用,特别是对于构建高性能、高并发的服务器端应用程序。标题提到"twisted适合python3.8版本...

    Twisted与异步编程入门

    【Twisted与异步编程入门】是一篇关于Python中Twisted框架和异步编程的教程。Twisted是一个强大的网络应用框架,特别适用于处理复杂的异步编程需求。文章首先强调了理解异步编程模型的重要性,指出只有深入理解模型...

    twisted例子

    这个"twisted例子"可能是一个从Twisted系列教程中提取的实际应用示例,旨在帮助学习者更好地理解和掌握Twisted的核心概念和用法。 在Twisted框架中,主要关注的是事件驱动的非阻塞I/O,它允许程序在等待网络操作...

    python3-Twisted

    这是因为Scrapy在运行过程中,会用到Twisted的异步处理能力来高效地并发请求网页,处理大量网络数据。 Twisted是一个开源的事件驱动网络编程库,用于构建高度可伸缩的网络应用。它支持多种协议,包括TCP、UDP、HTTP...

    Twisted适配python3.5

    这个文件可能是用户为了在Python 3.5环境中使用Twisted而寻找的,因为它表明了对这个特定Python版本的支持。安装这个whl文件可以确保Twisted在Python 3.5环境下正确运行,从而可能解决Scrapy在该环境下的兼容性问题...

    twisted 异步教程 中文版

    Twisted 是一个开源的事件驱动编程框架,它主要用Python语言编写,并被广泛用于...在阅读本教程时,读者应该尝试着从底层开始学习Twisted,逐步深入到框架的高级特性中去,从而能够灵活使用Twisted框架解决实际问题。

    中文Twisted入门教程

    - **用途**:Deferred广泛应用于Twisted的各种场景中,比如网络请求、数据库查询等。 #### 四、Twisted应用实例 - **客户端开发**:Twisted支持快速构建高性能的网络客户端,如HTTP客户端、FTP客户端等。通过定义...

    Twisted网络编程

    - **完全免费:** Twisted 是一个开源项目,遵循宽松的许可协议,允许开发者自由地在商业或非商业项目中使用它。 - **活跃的社区:** 有一个积极的开发者社区,可以通过邮件列表或 IRC 通道寻求技术支持和交流心得...

    Twisted-15.4.0

    在实际开发中,使用 Twisted 可以创建高性能的服务器应用,例如聊天服务器、游戏服务器或分布式系统。其异步模型允许服务器处理大量并发连接,而不会被单个请求阻塞。同时,Twisted 提供了丰富的测试工具和框架,如 ...

Global site tag (gtag.js) - Google Analytics