等待文件的脚本在while循环中使用100%CPU

时间:2014-11-17 08:47:48

标签: python performance while-loop sleep cpu-usage

我有一个在等待循环中使用100%单核的脚本。该脚本应处理出现在预设目录中的文件。因此,它等待文件出现,然后处理它们。看起来大致如下:

slept = 0
while True:
    if len(glob.glob(src_diretory+suffix)) > 0:
        slept=0
        # cast black magic spells on files ending in suffix, located in src_directory
    else:
        print("Slept "+str(slept)+" times.."
        slept+=1
        sleep.sleep(1)

在这种情况下,相当频繁的len(glob.glob(src_diretory+suffix))会导致如此高的CPU使用率吗?

3 个答案:

答案 0 :(得分:2)

第一个遇到此类问题的工具是profiler,它会告诉您详细花费的时间。

您不需要测试大于零的长度;如果列表有条目,则列表为true,否则为false。此外,您应该在阅读时使用您的条目。然而,这些都是化妆品的变化,所以我最好的猜测是水泡本身需要很长时间;是否有很多文件与同一目录中的模式不匹配?

我建议采用略有不同的结构:

while True:
    filenames = glob.glob(src_diretory+suffix)
    for filename in filenames:
        pass  # Process file here, including moving it away
    if not filenames:
        time.sleep(1)

理想情况下,您可以使用操作系统端监视器进行更改,例如inotify,kqueue,FSEvents或ReadDirectoryChanges,而不是轮询。您可能想尝试执行此特定等待的程序,例如incron和entr。

答案 1 :(得分:1)

根据操作系统(*),您可以找到低级函数,这些函数允许程序在不执行活动循环的情况下警告在目录中创建新文件。不幸的是,它不可移植,可能无法从Python直接获得。

如果你正在构建一个高性能系统,你可以看看这个,否则,你应该使用一个简单的假脱机算法:

  • 只要您在目录中找到文件:处理它们
  • 一旦你没有文件 - 在迭代之前睡一会儿(常见值在0.1到2秒之间)

(*)至少存在于Windows和最新的Linux内核

答案 2 :(得分:0)

while循环将尝试尽可能地作为mutch cpu,比较:

while True:
    pass

while True:
    time.sleep(0.001)