Как вызвать другую функцию или другой процесс, не дожидаясь эффективного ответа - PullRequest
2 голосов
/ 24 мая 2019

В Python на Linux у меня есть функция, которая вызывает себя снова и снова.Эта функция не должна возвращать ответ на вызывающую функцию, потому что вещи записываются в файлы (в файловой системе tempfs, в ram).

Ниже приведен очень простой пример того, что я делаю.

import signal
import subprocess
from sys import argv, exit

# Ignore sigterm.
signal.signal(signal.SIGCHLD, signal.SIG_IGN)


def main(arg1,arg2)
    # < A lot of compute-heavy stuff here >
    # Call myself again with some new arguments.
    subprocess.Popen(["/usr/bin/python","/myscript.py", arg1, arg2])
    # < More compute-heavy stuff >
    exit(0)

# Entry point of the script.
main(str(argv[1]),str(argv[2]))

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

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

Есть ли лучший / более быстрый способ сделать это?Я много читал о двойном разветвлении в Linux, я не уверен, что это решение, так как это будет создавать больше процессов.Также много думал о многопроцессорном модуле, но я не уверен, как использовать его для бесконечного вызова одной и той же функции из одной и той же функции снова и снова без сбоев из-за рекурсии.

1 Ответ

1 голос
/ 24 мая 2019

Я не уверен, но вы можете проверить это. замените эту строку:

    subprocess.Popen(["/usr/bin/python","/myscript.py", arg1, arg2])

с этим:

    subprocess.Popen(["/usr/bin/python","/myscript.py","&", "disown", arg1, arg2])

, если она не работает, попробуйте библиотеку os, как показано ниже:

import os
os.system( "<your command> & disown " )
...