繁体   English   中英

在Python中多线程的Twisted Websocket服务器和Swagger服务器?

[英]Autobahn Twisted websocket server and Swagger server multithreaded in python?

我可以运行这个摇摇欲坠的服务器

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共享为变量。

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

只是这样启动反应堆:

reactor.run(installSignalHandlers=False)

这将使您可以在非主线程中运行Twisted代码(所有线程都在同一线程中,因此应最小化或消除线程安全性问题)。 这样一来,您就可以在主线程中可以正常运行Swagger代码的地方(因为这通常是您的工作)。

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

是时候开始在线程之间传递数据了,您不仅希望一个变量被一个人写入,而另一个变量被读取。 那将是迈向拥有非线程安全代码的重要一步。 相反,请使用一个或多个Twisted API在线程之间进行消息传递。 例如, reactor.callFromThread是线程安全的(允许您从任何线程安全地调用它),并且可用于将消息从Swagger线程发送到Twisted反应器线程。 就像是:

reactor.callFromThread(process_received_id, id)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM