`
gashero
  • 浏览: 944606 次
  • 性别: 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
分享到:
评论

相关推荐

    twisted基础教程

    twisted基础教程

    Twisted系列教程.pdf

    第一部分:Twisted理论基础 第二部分:异步编程初探与reactor模式 第三部分:初步认识Twisted 第四部分:由Twisted...第二十部分:轮子中的轮子: Twisted和Erlang 第二十一部分:惰性不是迟缓: Twisted和Haskell

    twisted系列教程-中文

    twisted系列教程,中文翻译,很好的学习教程

    twisted-intro-cn, 在中文中,异步编程和 Twisted的Dave介绍.zip

    twisted-intro-cn, 在中文中,异步编程和 Twisted的Dave介绍 异步编程和 Twisted 中的介绍本项目是"twisted与异步编程入门"系列文章的简体中文翻译。原文由Dave撰写,参见 krondo.com 。如果你是Twisted新手,...

    Twisted系列教程 的中文翻译

    传说中的最好的twisted入门翻译教程...感谢作者的无私奉献..

    Python twisted教程

    最近有人在twisted邮件列表中问有没有一个可以让人快速学习twisted的文档.总体的来说:这个系列不是这样的一个文档.如果你没有很多时间或者耐心的话,这个系列的文章不太适合你. 不过,如果你对异步编程了解很少的话,...

    twisted 从入门到精通

    网络编程中我们越来越感觉twisted的强大,本教材是一本很好的twisted入门级教材

    中文Twisted入门教程

    本文对最基础的twisted架构进行了介绍,其中重点讲解了reactor和deferred,读者能够对twisted核心有很好的认识

    Twisted-17.1.0-cp36-cp36m-win_amd64.whl

    Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常艰难,他们迫切地需要一个可...

    Python Twisted-22.10.0-py3-none-any

    Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常艰难,他们迫切地需要一个可...

    Twisted-19.10.0-cp38-cp38.rar

    Twisted是用于Internet应用程序的基于事件的框架,支持Python 2.7和Python 3.5+。它包括用于许多不同目的的模块,其中包括: twisted.web:HTTP客户端和服务器,HTML模板和WSGI服务器 twisted.conch:SSHv2和...

    Twisted-17.9.0-cp36-cp36m-win_amd64

    Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常艰难,他们迫切地需要一个可...

    Twisted网络编程必备

    Twisted网络编程必备,Twisted是使用Python编写的,强壮的、面向对象的解释性语言。Python使它的爱好者充满热情。使用Python编程是一种乐趣,易于编写、易于阅读、易于运行。因为Python是跨平台的,所以可以运行...

    twisted实现的游戏服务器

    使用twisted开发的游戏服务器端,客户端为unity3d,请结合使用

    twisted入门教程源码

    Twisted Info Twisted入门教程源码

    Twisted与异步编程入门

    Twisted与异步编程入门,最好的入门资源。

    最新twisted软件

    最新twisted是python面向实时通信的应用框架,支持python3,希望做硬件开发、控制的有关人员喜欢

    twisted资料twisted资料

    twisted资料twisted资料twisted资料

    Python Twisted模块 10.2.0

    Python Twisted模块 10.2.0Python Twisted模块 10.2.0Python Twisted模块 10.2.0Python Twisted模块 10.2.0Python Twisted模块 10.2.0Python Twisted模块 10.2.0

    Twisted-13.1.0.win32-py2.7

    Twisted是一个事件驱动的python网络框架被所有类型的软件使用。

Global site tag (gtag.js) - Google Analytics