我试图运行延迟发送电子邮件,因为发送电子邮件的条件可能会在很长一段时间内处于开启状态,并且我不想接收和无限量的电子邮件警报......
为此,我正在尝试 threading.timer 给它一个延迟,并且每 15 分钟只发送一次电子邮件...我尝试了 .timer 对象的 900 秒长延迟,它可以工作(使用时间脚本)...但是当我运行它来发送电子邮件时,它首先发送电子邮件,然后进入计时器而不运行脚本的其他部分......电子邮件功能工作得很好......运行python 2.6.6
#!/usr/bin/env python
import time
import smtplib #for sending emails when warning
import threading
if True: #the possibility exists that the conditional is met several times thus sending lots of emails
t = threading.Timer(300,send_email('Tank temperature Overheat',tank_temp))
t.start() # after 300 seconds, the email will be sent but the script will keep running
print "rest of the script keeps running"
print "keeps running the scrpit and after 300s the email is sent"
关于为什么它不起作用或其他解决方法的任何想法?
在玩过它之后......它会进入睡眠状态,但会发送所有电子邮件......不是每X个.time设置的一封电子邮件......即
n=300
start = time.time()
while (time.time() - start < n):
led_temp = 56
if led_temp > 55:
t = threading.Timer(100, lambda: send_email('Lights temperature Overheat',led_temp))
t.start()
我不是每 100 秒收到一封电子邮件,而是在 300 秒后收到 36 封电子邮件.. ?? 知道为什么吗?(从下面的评论重新格式化)
在阅读了关于线程的答案后,我理解了这个问题......我仍然知道 python 并且从未使用过用户线程所以我想这是我在创建无数线程时收到的 36 封电子邮件的根本原因......我修复了它通过使用标志,并像这样测试代码:
def raise_flag():
global start
interval = 300
if start > interval:
start = 0
flag = True
print "Flag True, sending email"
return flag
else:
flag = False
start = start + 1
print "Flag OFF", start
time.sleep(1)
return flag
led_temp = 27
while led_temp > 26:
flag = raise_flag()
if flag:
send_email('Tank temperature Overheat',led_temp)
flag = False
print "Sent email"