【问题标题】:Websocket Server with twisted and Python doing complex jobs in the background带有twisted和Python的Websocket Server在后台执行复杂的工作
【发布时间】:2011-09-09 04:01:47
【问题描述】:

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

我的问题是,从逻辑的角度来看,如何在 Python 中做到这一点。我需要如何设置代码结构以及哪些模块是这项工作的最佳解决方案?目前,我确信在其中运行刮擦和选择的东西的线程中使用扭曲。但这可以以更简单的方式完成吗?我只找到简单的扭曲示例,但显然这似乎是一项更复杂的工作。有没有类似的例子?我该如何开始?

【问题讨论】:

    标签: python multithreading twisted websocket scrapy


    【解决方案1】:

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

    Twisted 应该驱动主服务器,因此您可能希望首先编写一些可以通过twistd 运行的东西(如果您是新手,请参阅here)。 @JP-Calderone 和 Scrapy 提到的 WebSocket 实现都是基于 Twisted 的,因此从基于 Twisted 的主服务器驱动它们应该是合理的。 SQLAlchemy 会更难,我之前在this 问题中对此进行了评论。

    【讨论】:

    • 谢谢你,让-保罗。仍然没有让它正常工作:ImportError: cannot import name _IdentityTransferDecoder
    • 好的,我通过升级扭曲修复了它。如果有人对我有更多建议,我将不胜感激。尤其是如何规划代码的结构以及如何让线程之间相互通信的简单解决方案。
    • 从受到github.com/rlotun/txWebSocket/blob/master/simple_server.py 的启发开始,但要注意:您描述的系统非常复杂,没有简单的解决方案,我们在这里谈论的是主要的架构工作,远不止这些往往来自一个典型的 SO 问题。
    • cyclone 附带的 WebSocket 服务器也可以正常工作。它甚至还有examples,可以帮助加快开发速度。
    【解决方案2】:

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

    下面是示例代码:

    这里是一个使用 txwebsocket 的例子:

    您可能在使用带有 Twisted 的 SQLAlchemy 时遇到问题;根据我的阅读,它们不能很好地协同工作(source)。您是否与 SQLA 结婚,或者另一个更兼容的 OR/M 就足够了?

    一些对twisted 友好的OR/M 包括Storm(一个fork)和Twistar,您可以随时使用Twisted 的核心数据库抽象库twisted.enterprise.adbapi。 还有其他产品的异步友好型数据库库,例如txMySQLtxMongotxRedispaisley (couchdb)。

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

    【讨论】:

    • 回答有点晚了,但我做了很多研究,现在正在考虑/尝试使用线程龙卷风实例来执行此操作,同时在多个线程中执行其他操作,并让它们通过 redis 通道进行通信订阅/发布。这似乎是最优雅的解决方案。
    • 也许我很快会在 github 上放一些东西。但我不是专业的编码员,所以没有什么可以向我学习的 ;)
    • 抱歉来晚了,只是想帮忙! ;) 希望它对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多