擅长:python、mysql、java
<p>您的代码最大的问题是,您永远不会在循环内再次调用<code>now()</code>,因此您只是在将初始时间与<code>16:15:10</code>进行比较而永远旋转。在</p>
<p>当我们在做的时候:为什么要把时间转换成字符串进行比较,而不是仅仅比较时间?在</p>
<p>但这种设计有更大的问题,不容易解决。在</p>
<p>如果你在16:15查看时间,然后睡觉,然后在16:25醒来,会发生什么?那么<code>now()</code>永远不会返回16:15:10。在</p>
<p>另外,你真的想消耗100%的CPU 10小时吗?在</p>
<p>更好的解决方案是编写<code>sleep_until</code>函数:</p>
<pre><code>def sleep_until(target):
left = target - dt.datetime.now()
if left > dt.timedelta(seconds=0):
time.sleep(left.total_seconds())
</code></pre>
<p>(如果使用的是Python2.7或3.4,则会更复杂一些,因为如果有信号,<code>sleep</code>将提前唤醒。但要处理这种情况,只需在整个过程中添加一个<code>while True:</code>循环。)</p>
<p>现在,唯一棘手的一点是计算出你第一次需要睡觉的时间,这并不复杂:</p>
^{pr2}$
<p>现在,我们只需循环等待,直到下一次:</p>
<pre><code>for wait in waits:
sleep_until(start)
print('Time to make the donuts')
start += wait
</code></pre>
<p>或者,当然,您可以从PyPI获取许多调度库中的一个。在</p>
<p>或者只需使用平台的cron/launchd/Scheduled Tasks API来运行脚本。在</p>