在我的 django View 中,我需要在子进程完成后发送电子邮件通知,因为子进程启动的脚本正在后台运行一些命令,因此电子邮件是在脚本完成之前发送的,有谁知道我该如何做这样做吗?
我的看法:
def getor(request):
# process
subprocess.call("./step1.sh", shell=True)
#send notification
current_site = get_current_site(request)
user = User.objects.values('username').order_by('id').last()
us = user['username']
subject = 'Notification of endprocess.'
message = render_to_string('notify.html', {
'us':us,
'domain':current_site.domain,
})
eml = User.objects.values('email').order_by('id').last()
toemail = eml['email']
email = EmailMessage(subject, message, to=[toemail])
email.send()
return render(request, 'endexecut.html')
最佳答案
快速修复可以将电子邮件发送放入函数中并创建一个 python 文件。从 step1.sh
调用它
我无法理解的是,subprocess.call 是一个阻塞函数。即,直到调用函数中的命令未完成为止,它不会转到下一行代码。
我会选择 gevent。把所有的函数都是geventspawn。在函数内部首先调用子进程并存储PID。接下来的代码应该是一个 while 循环并检查 PID 是否存在。如果不是,请发送邮件并打破循环。或者休眠几秒钟。
关于python - 如果子进程结束处理则运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45610473/