如何处理在Python中运行的多个脚本/进程

时间:2019-11-03 12:55:28

标签: python-2.7

因此,在较高的层次上,我编写了一个python脚本,其中包含一个循环,用于检查亚马逊简单队列服务是否具有我为我的Alexa创建的技能,该技能在调用时会将消息发送到队列。我的脚本反复检查队列60秒钟,当它在队列中找到正确的指令时,它将调用我的脚本以在树莓派正在运行的led矩阵上显示一些消息。一切正常,Alexa理解我的语音命令,led矩阵打开,开心的日子。

但是,有关关闭它的说明存在问题。像上面一样,当我想将其关闭时,Alexa会理解该命令,它将被发送到队列,而我的脚本会检查队列是否能识别该指令,并试图杀死正在运行led矩阵的进程。问题是,该过程不会被终止。据我所知,它会继续运行LED矩阵过程,直到我手动将其杀死为止,只有到那时,检查队列的脚本才能恢复工作并触发kill process命令,但是我显然没有任何反应已经在命令行中手动终止了该进程。

我是Python的新手(真的是编程!),所以我认为这与我如何同时处理多个python脚本/多个进程有关,并且我不了解底层机制python如何管理进程的知识..可能超出我的技能水平。但是我不知道如何在不将我所有的LED矩阵代码放在检查队列的同一脚本中的情况下执行此操作。 led矩阵脚本有数百行,具有许多不同的功能,因此将具有不同用途的这两个不同脚本混在一起是不合适的,这很混乱。

我在下面发布了队列检查代码,而不是led矩阵代码,但是可以帮助发布。任何人都可以提供的任何帮助,我们将不胜感激!即使只是在帮助我Google正确的事情上!

我还添加了指向终端调试输出的屏幕截图的链接

Terminal output for debugging


import boto3
import os, signal
import time
import subprocess

access_key = my key
access_secret =  my secret
region ="us-east-2"
queue_url = "https://sqs.us-east-2.amazonaws.com/486141425281/alexa-rpi-queue"

def pop_message(client, url):
    response = client.receive_message(QueueUrl = url, MaxNumberOfMessages = 10)

    #last message posted becomes messages
    message = response['Messages'][0]['Body']
    receipt = response['Messages'][0]['ReceiptHandle']
    client.delete_message(QueueUrl = url, ReceiptHandle = receipt)
    return message

client = boto3.client('sqs', aws_access_key_id = access_key, aws_secret_access_key = access_secret, region_name = region)

waittime = 20
client.set_queue_attributes(QueueUrl = queue_url, Attributes = {'ReceiveMessageWaitTimeSeconds': str(waittime)})

time_start = time.time()
while (time.time() - time_start < 60):
        print("Checking...")
        try:
                message = pop_message(client, queue_url)
                print(message)
                if message == "on":
                        subprocess.call(["python","/home/pi/rpi-rgb-led-matrix/bindings/python/trainsign/tube-sign-refactor.py", "--led-gpio-mapping=adafruit-hat", "--led-cols=128", "-r=64", "--led-brightness=65"])

                elif message == "off":
                        f2 = open('/home/pi/rpi-rgb-led-matrix/bindings/python/trainsign/pid2.py', 'r')
                        print("opened PID file")
                        pid2 = f2.read()
                        print("successfully read PID")
                        print(pid2)
                        os.kill(int(pid2), signal.SIGKILL)
                        print("successfully killed process")
                        sys.exit()
                        print("sucessfully exited process")
        except:
                pass

0 个答案:

没有答案