使用Twisted和Python的Websocket服务器在后台执行复杂任务
我想写一个服务器,这个服务器可以同时处理Websocket客户端的请求,同时通过sqlalchemy从mysql数据库中查询数据,还要用scrapy去抓取多个网站的数据。收到的数据需要进行计算,保存到数据库中,然后再发送给Websocket客户端。
我的问题是,从逻辑上来说,如何用Python来实现这个功能?我需要怎么搭建代码结构,哪些模块最适合这个工作?目前我觉得可以用twisted和线程来处理抓取和查询的部分。但是有没有更简单的方法呢?我只找到一些简单的twisted示例,但这看起来是个更复杂的任务。有没有类似的例子?我该从哪里开始?
2 个回答
Cyclone 是一个基于 Twisted 的“网络工具包”,它的设计和 Facebook/Friendfeed 的 Tornado 服务器类似,支持 WebSockets:https://github.com/fiorix/cyclone/blob/master/cyclone/web.py#L908
这里有个示例代码:
这是使用 txwebsocket 的一个例子:
你可能会在使用 SQLAlchemy 和 Twisted 时遇到问题;根据我所了解,它们的配合效果并不好(来源)。你是一定要用 SQLAlchemy,还是可以考虑其他更兼容的 ORM 呢?
一些适合 Twisted 的 ORM 包括 Storm(一个分支)和 Twistar,你也可以使用 Twisted 的核心数据库抽象库 twisted.enterprise.adbapi。还有一些适合异步操作的数据库库,比如 txMySQL、txMongo 和 txRedis,以及 paisley(用于 CouchDB)。
你可以考虑同时使用 Cyclone(或 txwebsockets)和 Scrapy,作为同一个 MultiService 的子服务,它们可以在不同的端口上运行,但打包在同一个应用实例中。这些服务可以通过父服务或某种 RPC 机制进行通信(比如 JSONRPC、Perspective Broker、AMP、XML-RPC(2)等),或者你也可以直接从 Scrapy 服务写入数据库,然后通过 WebSockets 读取数据。在我看来,使用 Redis 会非常合适。