高速公路Twisted websocket服务器和Swagger服务器多线程在python中?

高速公路Twisted websocket服务器和Swagger服务器多线程在python中?

问题描述:

我可以运行此招摇服务器高速公路Twisted websocket服务器和Swagger服务器多线程在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作为一个变量。

+0

除非Swagger或Twisted websocket中的某些内容主动阻止线程,否则只要它们仍在服务的后台运行,没有理由不起作用。然而,考虑到不同的范围,对问题进行分离并使它们作为单独的实例运行,通过使用某种形式的IPC在这两者之间交换数据可能是更好的想法。在[进程间通信和网络](https://docs.python.org/3/library/ipc.html)中列出了几种内置的方法,并且通过一些方法来完成它外部资源。 – zwer

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

刚开始的反应是这样的:

reactor.run(installSignalHandlers=False) 

这将让你在非主线程运行扭曲的代码(所有在同一个线程,所以threadsafey问题应尽量减少或消除)。这反过来会让你在主线程中运行你的Swagger代码,它应该可以正常工作(因为这是你通常所做的)。

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

当它开始在线程之间传递数据时,您不仅需要一个由另一个写入并由另一个读取的变量。这对于拥有非线程安全的代码来说是一大步。相反,使用一个或多个Twisted API进行线程间的消息传递。例如,reactor.callFromThread是线程安全的(您可以从任何线程安全地调用它),并且可以用于从Swagger线程向Twisted reactor线程发送消息。喜欢的东西:

reactor.callFromThread(process_received_id, id) 

现在process_received_id(id)将在扭曲反应器线程“很快”执行,你可以做任何你想要的,相信你没有线程安全问题,因为它是因为如果只是,从透视process_received_id,你在一个单线程应用程序。