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

2024-05-14 08:43:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,在一个等待循环中使用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使用率?在


Tags: 文件insrc目录脚本truelenif
3条回答

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

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

  • 只要在目录中找到文件:处理它们
  • 一旦你没有文件-在迭代之前休眠一段时间(0.1到2秒之间的公共值)

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

while循环将尝试尽可能多地占用多个cpu,比较:

while True:
    pass

while True:
    time.sleep(0.001)

处理此类问题的第一个工具是profiler,它将详细地告诉您时间花在哪里了。在

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

我建议采用稍微不同的结构:

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。在

相关问题 更多 >

    热门问题