опрос Python и начало после того, как другой Попен закончил - PullRequest
0 голосов
/ 25 января 2019

В python я использую уведомления опроса с обратным вызовом, поэтому, когда файлы обнаруживаются в корзине, затем из скрипта python я запускаю скрипт оболочки, который запускает серию команд python в диапазоне от 1 до 10 минут,

Я бы хотел, чтобы этот сценарий оболочки полностью завершился, прежде чем снова запускать сценарий оболочки, но уведомления опроса пытаются при обнаружении новых файлов.Я хотел бы, чтобы они подождали, пока не завершится.

def run_shell_script(summary_message):
    cmd = './process_job.sh' + ' ' + summary_message + ' &'
    p = subprocess.Popen([cmd], shell=True)
    (output, err) = p.communicate()  
    p_status = p.wait()

def poll_notifications(project, subscription_name):
    """Polls a Cloud Pub/Sub subscription for new GCS events for display."""
    subscriber = pubsub_v1.SubscriberClient()
    subscription_path = subscriber.subscription_path(
    project, subscription_name)

def callback(message):
    summary_message = summarize(message)
    run_shell_script(summary_message)

    subscriber.subscribe(subscription_path, callback=callback)
    print('Listening for messages on {}'.format(subscription_path))
    while True:
        time.sleep(60)

1 Ответ

0 голосов
/ 25 января 2019

Возможно, проблема в том, что ваш подпроцесс создал дочерний процесс для выполнения команды ".sh".Один из способов исправить это - подождать и все дочерние процессы.Например,

import psutil

def run_shell_script(summary_message):
    cmd = './process_mlbox_job.sh' + ' ' + summary_message + ' &'
    p = subprocess.Popen([cmd], shell=True)
    parent = psutil.Process(p.pid)
    [child.wait() for child in parent.children(recursive=True)]
    (output, err) = p.communicate()  
    # wait_to_finish(p)
    p_status = p.wait()

#def wait_to_finish(p):
#    parent = psutil.Process(p.pid)
#    children = parent.children()
#    for child in children:
#        wait_to_finish(child)
#        child.wait()
#    p.wait()

Однако это может быть связано с условиями гонки, если процесс p умирает слишком быстро.


Если это не проблема, есть другой способуправлять процессом run_shell_script и процессом обратного вызова.Вы можете отслеживать активные подпроцессы с помощью глобального списка и запускать новый подпроцесс только тогда, когда этот список пуст.Например,

messages_to_run = []
active_processes = []

def run_shell_script():
    if not messages_to_run: # indicating no messages to run
        return
    if active_processes:
        if active_processes[0].poll() is None: # indicating last process is still running
            return 
        active_process.pop(0)
    summary_message = messages_to_run.pop(0)
    cmd = './process_mlbox_job.sh' + ' ' + summary_message + ' &'
    p = subprocess.Popen([cmd], shell=True)
    active_processes.append(p)
    (output, err) = p.communicate()  
    p_status = p.wait()

Отдельно вам нужен бесконечный цикл, который продолжает вызывать «run_shell_script» и добавлять любые новые сообщения в «messages_to_run»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...