Многопроцессорность, логирование и Emebeded Python - PullRequest
0 голосов
/ 19 июня 2020

Я новичок с sh по Python, но не совсем неопытный. Я бы оценил свой опыт где-то между новичком и средним. При этом я застрял на этой проблеме несколько недель.

Я работаю в среде со встроенной версией Python в многозначной базе данных Rocket Universe. Ранее это было python 3.4, и обновление до 3.7 сломало то, как я использовал многопроцессорность. Пользователь этого приложения использует клиент S SH для взаимодействия с TUI

Некоторые сведения о том, что я пытаюсь выполнить sh:

У меня есть программа, написанная на BASI C, эта программа принимает аргументы параметров для отправки электронного письма, затем передает их в конструктивную функцию, которая анализирует аргументы стиля BASI C в аргументы Pythoni c, создает соответствующее сообщение электронной почты MIMEMultipart и затем отправляет его. . Идея состоит в том, чтобы заменить старую почтовую программу (AWMAIL) на более надежную альтернативу Python.

Отправка обычного c электронного письма работает нормально, без проблем. Отправка электронного письма с вложением в этой системе становится сложной задачей, так как BASI C выполнит вызов «Go построить вложение» в другую программу BASI C, а затем «Go отправить приложение по электронной почте» на мой адрес электронной почты. программа. Когда вложение занимает слишком много времени, Python не может его найти.

Очевидно, что простое решение - просто подождать дольше, чтобы найти вложение. Используя многопроцессорность, я смог сделать это «в фоновом режиме», используя другой процесс. Благодаря этому пользователь мог go заниматься своими делами, ожидая письма. (Вместо того, чтобы Python удерживать пользователя в командной строке). Многопоточность не возвращала контроль над терминалом пользователю, разветвление (os.fork ()) дублировало бы процесс, и терминал отправлял вывод и получал ввод от двух разных процессов (это было очень странно и сломало много вещей, 0/10 не рекомендуется).

В Python 3.4 я смог использовать это безупречно:


#I build the loggers and log handlers here. 
#

def send_awmail(uv_sentence, trace, login, tty):
    multiprocessing.set_executable('embed_python_exec')
    sys.argv = ["path_to_this_script"}
    multiprocessing.set_start_method("spawn")
    proc = multiprocessing.Process(target=send_awmail_email, args = (uv_sentence, trace, login, tty, ))  proc.start()


def send_awmail_email(uv_sentence, trace, login, tty):
    logging.debug("ProcID from child: {}".format(os.getpid()))
    awmail = myemailmodule.EmailBuilderClass(uv_sentence = uv_sentence, trace = trace, login =login, tty = tty)
    awmail.send_email()

Это сгенерирует запрос электронной почты и создаст электронное письмо, отправив его . Внутри класса EmailBuilderClass находятся различные операторы ведения журнала, которые записываются в файл журнала или отправляют электронное письмо с предупреждением в ИТ-отдел. Все работало, и все в мире было хорошо. Пока мы не обновились.

Сейчас мы находимся на более новой версии Universe, в которой используется python3 .7. Приведенный выше код больше не регистрируется и только изредка отправляет электронное письмо. Поскольку журналов нет, я не могу понять, что происходит. Я пробовал установить pro c .daemon = True перед запуском, похоже, это правильно вызывает функцию и работает, но что бы я ни делал, я не могу заставить ее регистрировать, когда daemon = True.

Я попытался создать регистратор в функции демона (send_awmail_email ()), но без улучшения.

Я нырнул в несколько кроличьих нор, пытаясь решить проблему:

  • Регистрация запроса на электронную почту
  • Отправка электронной почты
  • Создание электронной почты и прикрепление файла в фоновом режиме, чтобы пользователь не ждал у терминала.

Есть ли у кого-нибудь идеи, как это сделать? Я готов отказаться от библиотеки многопроцессорной обработки, если это необходимо. Поиск в Google и inte rnet не дал мне особой надежды на это. Я ценю любые идеи и отзывы.

...