【问题标题】:Django TCP server with tornado带有龙卷风的 Django TCP 服务器
【发布时间】:2018-05-04 10:02:13
【问题描述】:

我希望我的 django 应用程序使用 TCP/IP 套接字与远程计算机进行通信,并且我希望该套接字始终可用。我想使用 tornado 库。由于我只熟悉编写视图和模型等,我不完全确定将其放入我的代码库的哪个位置。

我正在考虑编写一个管理命令来运行龙卷风的服务器(请参阅http://tornado.readthedocs.io/en/latest/tcpserver.html),但是一旦管理命令退出,我怎么能在我的服务器上调用 .stop() 呢?我不希望它产生任何不会在我的管理命令退出时退出的线程,或者最终打开多个套接字,因为我只想要一个。

当然,我还希望侦听器驻留在我的 django 程序中的某个位置并可以访问它,而不仅仅是在管理命令代码中。我正在考虑从 django 的设置中导入一个类。

我的想法是正确的,还是有其他更好的方法?

编辑:至于我为什么要这样做:

我有一个我想与之通信的微控制器,我不想在它上面实现/解析 HTTP,我还想定期发送一些连接处于活动状态的指示,而 HTTP 没有似乎是要走的路

【问题讨论】:

  • 你没有提到你到底想要做什么。为什么需要“使用 TCP/IP 套接字与远程计算机通信”
  • @xyres 用解释编辑了我的原始问题
  • 好的,但是为什么你的管理命令存在时要停止服务器呢?您不想始终打开持久的 TCP 连接吗?我的意思是,如果您只想在命令运行时打开 TCP 连接,那么您就不需要 Tornado。您可以在管理命令文件中使用 socket 库创建一个 TCP 套接字。因此,当您的管理命令退出时,套接字也将关闭。
  • @xyres 因为我想用 systemd 之类的东西来管理我的管理命令,这意味着如果它正在运行,我想打开一个 TCP 连接。

标签: python django sockets tcp tornado


【解决方案1】:

管理命令是一个不错的方法,但我不愿意使用它启动服务器。龙卷风服务器是一个复杂的东西,有很多状态(包括代码库之外的状态,如 nginx、apache 或 HAProxy)和不同的健康状况。管理命令并非旨在处理所有这些问题。

这对开发来说可能是一件好事,在这种情况下,您可以通过在命令内调用IOLoop.current().start() 轻松地使您的管理命令在服务器之前不退出。

对于生产环境,我建议使用 Docker Compose 等现代编排工具,或者如果您计划将系统跨越多台机器,Docker Swarm 或 Kubernetes。这些工具将允许您以可靠的方式启动、关闭、扩展和检查各个组件的运行状况,而无需使用一组管理命令重新发明轮子。

无论哪种方式,如果您的 Tornado 代码与 Django 位于同一位置,那么您就是 able to access the database using your Django models 并重用项目的其他部分。除此之外,使用正在运行的 Django 服务器从管理命令 doesn't get any advantages 启动了一些东西。

【讨论】:

  • 意思是我最好创建纯python代码来与我的远程机器通信?那我将如何与 django 交流呢?而且我不明白关于让我的管理命令在服务器之前不退出的部分?
  • @Nirri 我宁愿考虑一个包含两个可执行部分的单一代码库——Django 和 Tornado。某种编排应该负责启动双方,而不是 django 命令 - 那时您基本上无法控制龙卷风部分。至于 django-tornado 通信,正如我所说,它可以是共享数据库;它也可能是暴露给龙卷风的 HTTP API。这取决于您设置的确切要求。
  • 编排如何让我控制龙卷风? @Vovanrock2002
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多