使用twisted和Python在后台执行复杂工作的Websocket服务器



我想编写一个服务器,它处理Websocket客户端,同时通过sqlalchemy进行mysql选择并同时抓取多个网站(scrapy)。必须计算接收到的数据,将其保存到数据库中,然后发送到websocket客户端。

我的问题是,从逻辑的角度来看,如何在Python中实现这一点。我需要如何设置代码结构,什么模块是这份工作的最佳解决方案?目前,我确信使用扭曲的螺纹,在其中刮取和选择的东西正在运行。但这能用一种更简单的方法吗?我只找到简单的扭曲的例子,但显然这似乎是一项更复杂的工作。有类似的例子吗?我该如何开始?

Cyclone是一个基于Twisted的"网络工具包",基于/类似于facebook/friendfeed的Tornado服务器,包含对WebSockets的支持:https://github.com/fiorix/cyclone/blob/master/cyclone/web.py#L908

下面是示例代码:

  • https://github.com/fiorix/cyclone/blob/master/demos/websocket/websocket.tac

以下是使用txwebsocket:的示例

  • http://www.saltycrane.com/blog/2010/05/quick-notes-trying-twisted-websocket-branch-example/

您可能在使用Twisted的SQLAlchemy时遇到问题;从我所读到的来看,它们在一起工作得不好(来源)。你是嫁给了SQLA,还是另一个更兼容的or/M就足够了?

一些扭曲友好的OR/M包括Storm(一个fork)和Twistar,您可以随时使用twisted的核心数据库抽象库twisted.enterprise.adbapi。其他产品也有异步友好的数据库库,如txMySQL、txMongo和txRedis,以及paisley(couchdb)。

您可以将Cyclone(或txwebsockets)和Scrapy都用作同一MultiService的子服务,在不同的端口上运行,但打包在同一应用程序实例中。服务可以通过父服务或某些RPC机制(如JSONRPC、Perspective Broker、AMP、XML-RPC(2)等)进行通信,也可以只从scrapy服务写入数据库并使用websocket从中读取。Redis将非常适合这个IMO.

理想情况下,您希望避免编写自己的WebSockets服务器,但由于您运行的是Twisted,您可能无法做到这一点:有几个WebSockets实现(请参阅PyPI上的搜索)。不幸的是,它们都不是基于Twisted的[编辑请参阅下面@JP Calderone的评论。]

Twisted应该驱动主服务器,所以您可能想从编写可以通过twistd运行的东西开始(如果您是新手,请参阅此处)。@JP Calderone和Scrapy提到的WebSocket实现都是基于Twisted的,所以从基于Twisted-based的主服务器上驱动它们应该是合理的琐碎。SQLAlchemy将更加困难,我之前在这个问题中对此进行了评论。

相关内容

  • 没有找到相关文章

最新更新