使用Twisted和Python的Websocket服务器在后台执行复杂任务

8 投票
2 回答
2716 浏览
提问于 2025-04-16 19:01

我想写一个服务器,这个服务器可以同时处理Websocket客户端的请求,同时通过sqlalchemy从mysql数据库中查询数据,还要用scrapy去抓取多个网站的数据。收到的数据需要进行计算,保存到数据库中,然后再发送给Websocket客户端。

我的问题是,从逻辑上来说,如何用Python来实现这个功能?我需要怎么搭建代码结构,哪些模块最适合这个工作?目前我觉得可以用twisted和线程来处理抓取和查询的部分。但是有没有更简单的方法呢?我只找到一些简单的twisted示例,但这看起来是个更复杂的任务。有没有类似的例子?我该从哪里开始?

2 个回答

4

理想情况下,你可能不想自己写一个WebSockets服务器,但因为你在使用Twisted,可能没办法避免这个问题:有几个WebSockets的实现(可以查看这个链接在PyPI上)。不过不幸的是,没有一个是基于Twisted的。

Twisted应该负责主服务器的运行,所以你可能想先写一些可以通过twistd运行的东西(如果你对这个不太熟悉,可以查看这里)。@JP-Calderone提到的WebSocket实现和Scrapy都是基于Twisted的,所以从你的主Twisted服务器来使用它们应该是比较简单的。至于SQLAlchemy,可能会更复杂,我之前在这个问题中提到过。

5

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。还有一些适合异步操作的数据库库,比如 txMySQLtxMongotxRedis,以及 paisley(用于 CouchDB)。

你可以考虑同时使用 Cyclone(或 txwebsockets)和 Scrapy,作为同一个 MultiService 的子服务,它们可以在不同的端口上运行,但打包在同一个应用实例中。这些服务可以通过父服务或某种 RPC 机制进行通信(比如 JSONRPCPerspective BrokerAMPXML-RPC2)等),或者你也可以直接从 Scrapy 服务写入数据库,然后通过 WebSockets 读取数据。在我看来,使用 Redis 会非常合适。

撰写回答