首页 > 解决方案 > 如何使用 Python 在远程服务器上启动异步服务器?

问题描述

我有一个运行 Linux 的虚拟服务器,有 8 个内核。32 GB RAM,另外还有 1 TB。它应该是一个开发环境。(测试和产品相同)这是我可以从 IT 获得的。服务器只能通过 putty 或直接 tcp/ip 端口通过所谓的跳转服务器访问(ssh 是必须的)。

我正在处理的应用程序通过多处理启动多个进程。在每个进程中都会启动一个异步事件循环,在某些情况下还会启动一个异步套接字服务器。基本上它是一个低级的数据流和处理应用程序(不幸的是还没有可用的 kafka 或类似技术)。实时应用程序永远运行,与用户没有或有限的交互(读取/处理/写入数据)。

我认为,IPython 是一个选项,但是 - 也许我错了 - 我认为它会根据客户端请求启动新内核,但我需要从主代码开始新进程而无需用户交互。如果是这样,这可以作为监视应用程序、从中收集数据、向主模块发送新用户命令的选项,但不确定如何远程运行进程和异步服务器。

我想了解如何在给定的环境中完成这些操作。我不知道从哪里开始,还有什么选择。而且我不正确理解 ipython,他们的页面对我来说还不是很明显。

请帮帮我!先感谢您!

标签: pythonipythonpython-asynciopython-multiprocessingremote-server

解决方案


经过大量的研究和学习,我在我们的“沙盒”环境中找到了一个可能的解决方案。首先,我不得不将问题拆分为几个子问题:

  • “远程”开发
  • 并行化
  • 调度和执行并行代码
  • 这些“引擎”之间的数据共享
  • 控制这些“引擎”

让我们详细看看:

  • 远程开发意味着您想在笔记本电脑上编写代码,但代码必须在远程服务器上执行。简单的答案是 Jupyter Notebook(或等效解决方案),尽管它有几个折衷方案,也有其他解决方案可用,但部署和使用速度更快,并且依赖性、维护等最少。
  • 并行化:在处理多处理时,iPython 内核遇到了一些挑战,因此必须并行运行的每个代码都将编写在单独的 Jupyter Notebook 中。在单个代码中,我仍然可以使用 eventloop 来获得异步行为
  • 执行并行代码:我将使用几个选项:
    • iPyParallel - 多处理的“解决方法”
    • papermill - 使用命令行参数执行 JN(可选)
    • 在 Jupyter Notebook 中使用 %%writefile 魔术命令 - 创建可导入文件
    • os 任务调度程序,如 cron。
    • 与事件循环异步
    • 还没有选择:docker、多处理、多线程、云(aws、azure、google...)
  • 数据共享:选择ZeroMQ,花时间学习,但比在纯套接字上编写所有内容更简单、更容易。有其他选择,但有额外的依赖,还有一些非常有用的好处(稍后会检查它们):RabbitMQRedis 消息代理等。首选 ZMQ 的原因:快速、简单、优雅,而且只是一个库。(已知风险:我们的 IT 会更喜欢 RabbitMQ,但这个问题稍后会出现 :-))
  • 控制引擎:现在这个答案很明显:单独的 python 代码(可以作为 JN 代码进行测试,但很容易变成纯 .py 并安排它)。这个可以通过 ZMQ 套接字与其他模块进行通信:健康检查、发送新参数、命令等......

推荐阅读