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