如何同时运行多个无限循环的Python脚本

时间:2014-11-17 23:32:18

标签: python shell

我有一个python项目,它由3个无限运行的Python脚本组成,我想同时运行它们。他们是:

  • web.py:Flask应用程序将永远作为项目的控制面板运行。
  • pir.py:是一个脚本,它会使运动传感器变为高电平,做一些事情,然后继续循环,直到传感器再次变为高电平。
  • keypadd.py:循环直到键盘变为高电平,读取密码组合,再做一些东西并再次循环。

我尝试在shell脚本中使用sh运行这三个文件。但是一旦web.py运行,似乎其他Python文件在队列中等待,直到web.py完成作业然后将被执行。但是web.py永远不会完成这项工作,因为它会不断循环。我希望脚本按以下顺序执行:web.py,pir.py,然后是keypadd.py。

我该怎么做?

我使用的Shell脚本:

#!/bin/sh
# launcher.sh


cd /home/pi/Ptoject
sudo python web.py
sudo python pir.py
sudo python keypadd.py

3 个答案:

答案 0 :(得分:3)

另一个选择是使用Python包装器脚本而不是shell脚本,导入所需的功能,并在其他进程中运行它们:

import time
import mutliprocessing

import web
import pir
import keypadd

processes = []

for func in [web.function, pir.function, keypadd.function]:
    processes.append(multiprocessing.Process(target=func, args=(arg1, arg2)))
    processes[-1].start()

# Do stuff

while True:
    time.sleep(600) # sleep for 10 minutes
    living_processes = [p.is_alive() for p in processes]
    if living_processes < 3:
        for p in living_processes:
            p.terminate()

        print("Oops: Some processes died")
        # do other error handling here if necessary

这种方法有一些好处:

  • 这一切都在Python中,我认为当我的项目的其余部分是Python时它很好。
  • 您还可以在“do stuff”区域中添加一些逻辑来监视您的进程,如果一个异常失败,则会杀死其他逻辑,这与我在示例中所做的类似。
  • 更好的是,您可以创建一个multiprocessing.Queue(),如果一个进程失败,请向其他进程发送一个“毒丸”,让它们干净地退出而不是终止它们。你需要在无限循环的例程中添加一些逻辑,让它们每隔一段时间检查一次队列,看看它们是否应该退出,并在你丢弃药丸后很好地加入它们。
  • 使用此方法停止所有操作比停止后台进程更容易。主脚本中的单个Ctrl-C将导致KeyboardInterrupt传播到子进程,同时使所有内容停止。

答案 1 :(得分:0)

#!/bin/sh
# launcher.sh
cd /home/pi/Ptoject
sudo python web.py & sudo python pir.py & sudo python keypadd.py

另一种解决方案是使用supervisord并对您的文件进行守护。

答案 2 :(得分:0)

添加&符号来分叉流程 -

cd /home/pi/Ptoject
sudo python web.py &
sudo python pir.py &
sudo python keypadd.py