【问题标题】:Autobahn Twisted websocket server and Swagger server multithreaded in python?高速公路 Twisted websocket 服务器和 Swagger 服务器在 python 中多线程?
【发布时间】:2017-07-21 10:01:31
【问题描述】:

我可以运行这个 swagger 服务器吗

app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = JSONEncoder
app.add_api('swagger.yaml', arguments={'title': ''})

app.run(port=8080)

还有这个 websocket 服务器

from autobahn.twisted.websocket import WebSocketServerProtocol
import sys

from twisted.python import log
from twisted.internet import reactor
log.startLogging(sys.stdout)

from autobahn.twisted.websocket import WebSocketServerFactory
factory = WebSocketServerFactory()
factory.protocol = MyServerProtocol

reactor.listenTCP(9000, factory)
reactor.run()

在两个不同的线程中,在 python 中?最终,当id 发布到我的swagger API 时,我想将此id 转发到我的websocket 服务器,然后通过现有的匹配连接将其发送到我的websocket 客户端。所以我想如果我在两个线程中运行这两个,也许我可以将这个id 作为变量共享。

【问题讨论】:

  • 除非 Swagger 或 Twisted websocket 中的某些东西主动阻止线程,只要两者都在您的服务后台运行,它就没有理由不起作用。但是,考虑到不同的范围,最好进行关注点分离,并通过使用某种形式的 IPC 在这两者之间交换数据,让它们作为单独的实例运行。 Interprocess Communication and Networking 上列出了几种内置方法,并且有大量方法可以通过外部资源来实现。

标签: python multithreading websocket swagger twisted


【解决方案1】:

如果您选择在非主线程中运行 Twisted reactor,则必须禁用其信号处理(因为 Python 仅允许在主线程中使用信号处理程序)。这将禁用某些功能,但如果您不使用该功能,这应该没问题。

以这种方式启动反应器:

reactor.run(installSignalHandlers=False)

这将让您在非主线程中运行您的 Twisted 代码(都在同一个线程中,因此应该尽量减少或消除线程安全问题)。反过来,这将允许您在应该可以正常工作的主线程中运行 Swagger 代码(因为这是您通常所做的)。

或者,您可以将 Swagger 代码放在非主线程中,并将 Twisted 放在主线程中。我不知道您是否需要采取一些步骤才能在非主线程中运行 Swagger 代码。

当开始在线程之间传递数据时,您不只是想要一个由一个线程写入并由另一个读取的变量。这将是朝着拥有非线程安全代码迈出的一大步。相反,使用一个或多个 Twisted API 在线程之间进行消息传递。例如,reactor.callFromThread 是线程安全的(您可以从任何线程安全地调用它),并且可用于将消息从 Swagger 线程发送到 Twisted reactor 线程。比如:

reactor.callFromThread(process_received_id, id)

现在process_received_id(id) 将“很快”在 Twisted reactor 线程中执行,你可以做任何你想做的事情,确信你没有线程安全问题,因为它只是 好像,来自从process_received_id 的角度来看,您处于单线程应用程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多