Python - 是time.sleep(n)cpu密集型?

She*_*rSt 12 python linux

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

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
Run Code Online (Sandbox Code Playgroud)

总而言之,程序会休眠,直到需要执行下一个作业.它运行工作,找到下一个要运行的工作,然后睡觉直到它需要运行下一个工作(继续无限).我打算在linux机器上运行它 - 使用cron作业是可能的.任何人都有意见吗?

aba*_*ert 31

不,它不是CPU密集型的.

文件说:

暂停执行给定的秒数.

Python无法保证在每个可能的实现中,这意味着操作系统永远不会在睡眠期间安排您的进程.但是在每个平台上,Python都会尝试在不使用任何CPU的情况下执行适当的操作以阻止指定的时间.在某些平台上,这可能仍然意味着一点点CPU,但它将尽可能少.

特别是,既然你问过linux,可能是CPython:

在Linux和大多数其他POSIX平台上,它通常会使用select.请参阅3.3源代码.

手册页使得它很清楚,select暂停,直到信号,超时或准备I/O(在这种情况下,有没有FDS,因此后者是不可能的).

您可以阅读内核源代码以获取完整的详细信息,但基本上,除非有任何意外信号,否则您将无法安排,除非在开始时可能进行少量旋转select(作为优化情况,select几乎可以立即返回).


在摘要的中间,问题从" sleepCPU密集型"变为"我应该使用sleep还是cron作业?"

无论哪种方式,你都不会在等待时烧掉任何CPU.有一些优点和缺点,但大多数都是微不足道的.从(大致,主观)最重要到最少,一个cron工作:

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


cod*_*543 5

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

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