多处理,日志记录和嵌入式Python

时间:2020-06-19 20:56:18

标签: python email universe rocket

我是Python的新手,但并非完全没有经验。我会评价我的经验,介于初学者和中级之间。话虽这么说,我已经在这个问题上停留了好几个星期。

我正在Rocket Universe多值数据库中使用Python嵌入式版本的环境中工作。这以前是python 3.4,升级到3.7破坏了我使用多处理的方式。该应用程序的用户使用SSH客户端与TUI进行交互

关于我要完成的工作的一些背景:

我有一个用BASIC编写的程序,该程序接收用于发送电子邮件的参数参数,然后将它们传递到一个构造函数中,该函数将BASIC样式参数解析为Pythonic,然后构建适当的MIMEMultipart电子邮件msg,然后发送。这个想法是要替换旧的电子邮件程序(AWMAIL),以便使用更可靠的Python。

发送普通电子邮件效果很好,没有问题。在此系统中,发送带有附件的电子邮件变得很棘手,因为BASIC会先调用“转到构建附件”到另一个BASIC程序,然后再“转到给附件发送电子邮件”到我的电子邮件程序。如果附件的构建时间太长,Python将找不到它。

很显然,简单的解决方法是等待更长的时间来查找附件。通过使用多处理,我能够在不同的过程中在“后台”执行此操作。这样一来,用户就可以在等待电子邮件的同时开展业务。 (而不是Python将用户保留在命令行中)。多线程处理并未将终端的控制权释放给用户,叉(os.fork())将复制该过程,并且终端将发送输出并从2个不同的过程中获取输入(这很奇怪,并破坏了很多东西, 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内部是各种日志记录语句,它们可以写入日志文件或向IT发送警报电子邮件。一切正常,世界上一切都很好。直到我们更新。

我们现在正在使用python3.7的Universe的较新版本。上面的代码不再记录,仅偶尔发送电子邮件。因为没有日志,所以我无法解读正在发生的事情。我尝试在启动之前设置proc.daemon = True,这似乎可以正确调用该函数并且可以正常工作,但是无论我做什么,当daemon = True时我都无法将其记录下来。

我尝试在守护程序功能(send_awmail_email())中构建记录器,但没有任何改善。

我解决了几个兔子洞,试图解决以下问题:

  • 记录电子邮件请求
  • 发送电子邮件
  • 构建电子邮件并在后台附加文件,以使用户不必在终端上等待。

有人对如何做到这一点有任何想法吗?如果需要,我愿意放弃多处理库。谷歌搜索和搜索互联网并没有给我太大希望。我感谢任何想法和反馈。

0 个答案:

没有答案