Python – 是time.sleep(n)CPU密集?

我一直在用python脚本中的time.sleep(n)来使它在不同的时间间隔执行作业。 伪代码看起来像:

 total_jobs = [...] next_jobs_to_run = next_closest(total_jobs) min_time_to_wait = closestTime(nextJobsToRun) wait until min_time_to_wait run them all get next jobs 

总而言之,程序一直进行到下一个工作需要执行。 它运行这个工作,发现下一个工作要运行,然后睡觉,直到需要运行下一个工作(继续无限)。 我打算在Linux机器上运行这个 – 使用cron作业是一种可能性。 任何人都有意见吗?

不,这不是CPU密集型的。

该文件说:

暂停执行给定的秒数。

Python实际上不能保证在每一个可能的实现中,这意味着操作系统永远不会在睡眠期间安排你的进程。 但是在每个平台上,Python都会尝试在不使用任何CPU的情况下,在指定的时间内执行相应的操作。 在某些平台上,这可能仍然意味着一点点的CPU,但它将尽可能少地合理。

特别是,因为你问了关于Linux,大概是CPython:

在linux和大多数其他的POSIX平台上,一般会使用select 。 看3.3源 。

手册页清楚地表明select挂起,直到信号,超时或准备好的I / O(在这种情况下,没有fds,所以后者是不可能的)。

您可以阅读内核源代码以获取完整的细节信息,但基本上,除非出现任何意外的信号,否则根本不会计划安排,除非可能在select开始时进行少量旋转(作为个案优化select几乎可以立即返回)。


在你的总结中,问题从“ sleep CPU密集型”变为“我应该使用sleep还是cron工作?”

无论哪种方式,您在等待时都不会烧毁任何CPU。 有一些利弊,但其中大部分是微不足道的。 从(大致和主观上)最重要的是至少从事一项cron工作:

  • 允许配置(例如,更改时间表),无需编辑源代码。
  • 需要配置才能工作。
  • 意味着更少的代码 – 意味着更少的错误,对于未来的读者来说,意义更小。
  • 将持续在系统关闭。
  • 即使您的脚本以异常或信号退出,也会再次触发。
  • 如果计划的时间间隔错过了N次(这个没有指定,不同的cron实现做不同的事情),而不是保证为0,则可以触发0,1或者N次。
  • 处理系统时钟变化的机会更大。
  • 每次启动时都必须支付流程启动,解释器启动等。
  • 不会浪费页表和进程表空间,因为没有进程正在运行,也没有内存映射。

不,这不是处理器密集型的。 它让处理器闲置。

根据文档 ,它暂停执行,这意味着它不是处理器密集型的。 繁忙的等待将是处理器密集型的。