【问题标题】:Simplest way to spawn multiple Python instances in single SSH connection在单个 SSH 连接中生成多个 Python 实例的最简单方法
【发布时间】:2018-06-07 20:39:18
【问题描述】:

我有一个基于运行最新版本 Raspbian Jessie 的 Raspberry Pi 的项目。 4 个独立的 Python 脚本(包含用于操作多个步进电机、其他硬件设备以及轮询 ADC 和输入设备的无限循环)在 4 个独立的 SSH 连接中同时运行,并通过一个简单的 UDP 套接字服务器在彼此之间进行数据通信。

此时一切都运行良好,但是,与机器建立 4 个单独的 SSH 连接是不可行的。本质上,我正在寻找一种方法来生成 4 个单独的 Python 实例:

  1. 不受Global Interpreter Lock的约束
  2. 能够相互传递变量

目前系统基于 Python 2.7。我已经尝试过 Python 3(asyncio)但无济于事。我也尝试使用multiprocessingthreading 模块,但未成功。

我不一定需要另一个 Python 脚本来生成所有 4 个实例;一个shell脚本就可以了。我知道可以使用os.subprocess(shell=True) 或类似的东西吗?

谢谢, 亚当

【问题讨论】:

  • 这个问题感觉有点开放,因为这是一个设计选择,有很多解决方案。如果我不得不建议,也许是一个 ssh,然后在微控制器上产生 4 个 bash 进程来控制步进电机?
  • 你能写一个shell脚本在后台调用这4个函数吗?即,从 ssh 调用 bash ./caller.sh 有 4 行 python2.7 script1.py & python2.7 script2.py & ...?
  • 单个shell脚本不只是等待第一个脚本退出吗? (这永远不会发生)。
  • 目前这不是设计选择 - 它缺乏实施知识!
  • @jeremysprofile 但是,独立的 Python 进程是如何开始的,会共享变量吗?

标签: python bash shell ssh raspberry-pi


【解决方案1】:

因为这似乎是解决方案:

您只需与调用单个脚本的机器建立一个 SSH 连接:

ssh me@raspi "bash ~/caller.sh"

该脚本将调用您的所有函数:

#!/usr/bin/env bash
python script1.py &
python script2.py &
python script3.py &
python script4.py &

行尾的& 表示该行的命令将在后台运行,bash 不会等待该行完成后才开始下一行。最后一个命令上的& 是可选的,具体取决于您是否要立即返回到命令提示符。

对于您的评论,不会禁止对标准输出的写入;您将看到所有 4 个 python 脚本的输出根据每个脚本的距离混合在一起。

【讨论】:

    【解决方案2】:

    bash 脚本启动 4 个后台作业可能适用于 PoC 阶段和测试。但是,如果稍后您想要可靠地运行您的代码超过几分钟,您将需要实现一些监督者逻辑。我的建议是使用systemd 来设置 1 个控制器和 4 个工作器服务。这样systemd 将完成监控/重启/等服务的繁重工作,而您将使用ssh 来控制主服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2016-05-10
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多