Twisted应用

Twisted中的Application是一个代表整个Twisted应用的最顶层服务,其中实现了IServiceIServiceCollection等接口。如果使用Twisted提供的twistd脚本来实现守护进程,则必须要用到这个类。Twisted已经提供了一个常用的Application实现,大部分情况下我们不必自行完成Applicaition实现。

IService接口定义了一个可以启动和停止的命名服务,其中有两个方法比较关键:startService()stopService(),分别用于启动和停止服务。IService中有两个必需的属性:name用来对服务进行命名,running用来表示服务当前的运行状态。IService中还提供了一个setServiceParent()方法,用来将服务添加到一个IServiceCollection对象中,使得服务可以被更加容易的管理。

twistd脚本最关心的就是Application,所以针对以下示例:

top_service = service.MultiService()

content_service = ContentService(content_source) # 自定义内容服务
content_service.setServiceParent(top_service)

factory = ContentServiceFactory(content_service) # ContentServiceFactory是自定义的用于建立服务的工厂类
tcp_service = internet.TCPServer(port, factory, iterface=iface) # 建立TCP服务
tcp_service.setServiceParent(top_service)

application = service.Application('Demo')
top_service.setServiceParent(application)

可以使用命令:twistd --nodaemon --python app.py来启动。

Warning

注意:--nodaemon表示要求twistd以常规进程方式启动而不是守护进程。

IService接口允许我们将不同的任务分开定义,形成不同的服务。而在实际项目中,服务之间往往是紧密联系的。Twisted提供了一个MultiService类来将多个服务组织在一起作为一个服务存在。由于MultiService实现了IServiceCollection,所以只需要调用.setServiceParent()MultiService实例设为服务的父服务即可将服务添加到MultiService中。具体用法可参考上面的示例。