python 2.7.5: запуск всей функции в фоновом режиме

#background-process

#фоновый процесс

Вопрос:

Я новичок в python. Я хочу запустить целую функцию в фоновом режиме (потому что это может занять некоторое время или даже сбой). Вот функция:

 def backup(str):
    command = barman_bin   " backup "   str
    log_maif.info("Lancement d'un backup full:")
    log_maif.info(command)
    p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = p.communicate()
    if p.returncode == 0:
        for line in output[0].decode(encoding='utf-8').split('n'):
            log_maif.info(line)
    else:
        for line in output[0].decode(encoding='utf-8').split('n'):
            log_maif.error(line)
    log_maif.info("Fin du backup full")
    return output
  

Я хочу запустить эту функцию в фоновом режиме в цикле :

 for host in list_hosts_sans_doublon:
    backup(host) # <-- how to run the whole function in background ?
  

В ksh я бы написал что-то вроде backup $host amp; функции with backup, которая принимает $host в качестве аргумента.

Комментарии:

1. Привет, Эрик. Не эксперт, но я считаю, что то, что вы ищете, — это асинхронный способ запуска функции. Возможно, вы захотите заглянуть в документацию и попытаться найти, как добиться асинхронного поведения.

2. Спасибо xploraj. У меня была попытка с async, но я столкнулся с ошибками типа «SyntaxError: недопустимый синтаксис», которые мне не удалось исправить, вот почему я спрашиваю…

Ответ №1:

То, что вы ищете, — это запустить функцию в другом потоке, насколько я понимаю. Для этого вам нужно использовать модуль потока python. Вот как вы запускаете поток:

 import threading
def backup(mystring):
    print(mystring)

host="hello"
x = threading.Thread(target=backup, [host])
x.start()
Do what ever you want after this and the thread will run separately. 
  

Комментарии:

1. Спасибо, Фади Абу Рейд. Я подтверждаю, это то, что я ищу. Мне просто нужно было написать x = threading . Поток (цель = резервное копирование, аргументы = (хост,)) и тогда это сработало.