如何使用Python在远程服务器上启动asyncio服务器?

问题描述

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

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

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

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

请帮帮我!预先谢谢你!

解决方法

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

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

让我们详细看看:

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