Python 多处理进程在一段时间后休眠

2024-06-25

我有一个脚本,它运行一个目录,并搜索具有给定结尾(即 .xml)的所有文件以查找给定字符串并替换它们。为了实现这一点,我使用了 python 多处理库。

作为示例,我使用 1100 个 .xml 文件,其中包含大约 200MB 的数据。在我的 MBP '15 15" 上,完整执行时间为 8 分钟。

但几分钟后,进程的进程将进入睡眠状态,我在“顶部”中看到了这一点(此处为 7m 之后...)。

顶部输出

PID   COMMAND      %CPU  TIME     #TH    #WQ  #PORT MEM    PURG   CMPR PGRP PPID STATE    BOOSTS         %CPU_ME %CPU_OTHRS
1007  Python       0.0   07:03.51 1      0    7     5196K  0B     0B   998  998  sleeping *0[1]          0.00000 0.00000
1006  Python       99.8  07:29.07 1/1    0    7     4840K  0B     0B   998  998  running  *0[1]          0.00000 0.00000
1005  Python       0.0   02:10.02 1      0    7     4380K  0B     0B   998  998  sleeping *0[1]          0.00000 0.00000
1004  Python       0.0   04:24.44 1      0    7     4624K  0B     0B   998  998  sleeping *0[1]          0.00000 0.00000
1003  Python       0.0   04:25.34 1      0    7     4572K  0B     0B   998  998  sleeping *0[1]          0.00000 0.00000
1002  Python       0.0   04:53.40 1      0    7     4612K  0B     0B   998  998  sleeping *0[1]          0.00000 0.00000

所以现在只有一个进程在完成所有工作,而其他进程在 4 分钟后就睡着了。

代码片段

# set cpu pool to cores in computer
pool_size = multiprocessing.cpu_count()

# create pool
pool = multiprocessing.Pool(processes=pool_size)

# give pool function and input data - here for each file in file_list
pool_outputs = pool.map(check_file, file_list)

# if no more tasks are available: close all
pool.close()
pool.join()

那么为什么所有进程都进入睡眠状态呢?

我的猜测:文件列表被分配给池中的所有工作人员(每个工作人员的数量相同),并且少数人只是“幸运”地获得了小文件 - 因此更早完成。这是真的吗?我只是认为它的工作方式更像是一个队列,以便每个工作人员在完成时都会获得一个新文件 - 直到列表为空。


正如 @Felipe-Lema 指出的,它是一个经典的 RTFM。

我使用多处理队列而不是池重新设计了脚本的上述部分,并改进了运行时:

def check_files(file_list):
    """Checks and replaces lines in files
    @param file_list: list of files to search
    @return counter: number of occurrence """

    # as much workers as CPUs are available (HT included)
    workers = multiprocessing.cpu_count()

    # create two queues: one for files, one for results
    work_queue = Queue()
    done_queue = Queue()
    processes = []

    # add every file to work queue
    for filename in file_list:
        work_queue.put(filename)

    # start processes
    for w in xrange(workers):
        p = Process(target=worker, args=(work_queue, done_queue))
        p.start()
        processes.append(p)
        work_queue.put('STOP')

    # wait until all processes finished
    for p in processes:
        p.join()

    done_queue.put('STOP')

    # beautify results and return them
    results = []
    for status in iter(done_queue.get, 'STOP'):
        if status is not None:
             results.append(status)

     return results
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 多处理进程在一段时间后休眠 的相关文章

随机推荐

  • 静态解构器

    我在 Web 服务中实例化了类 该服务在静态成员中保留了一些资源 如果我不是静态地持有这些资源 我可能会通过一些 IDisposable 对象访问它们 我可以在 Dispose 上释放资源 无论保留此会话是否是一个好主意 NET 是否提供了
  • 如何显示base64编码的pdf?

    我必须在新选项卡中显示 base64 pdf 我正在使用下面的代码 var windo window open var objbuilder objbuilder windo document write objbuilder 它可以在 F
  • 具有多种布局的 RecyclerView

    我正在使用 RecyclerView 在 CardView 中显示文本 但我想在 RecyclerView 的顶部添加一个 Header TextView 如下所示 因此 我仅使用 TextView 制作了另一个布局文件 top heade
  • 将在gunicorn上运行的Flask应用程序代理到nginx中的子路径

    我有一个 Flask 应用程序在gunicorn上运行http 127 0 0 1 4000 gunicorn b 127 0 0 1 4000 webapp app 现在我想使用nginx作为反向代理和转发http myserver co
  • 使用反应式表单时将模板引用变量绑定到 ngModel

    我正在使用反应式表单 当输入状态无效时 我会显示错误 这是我的观点 div class form group div
  • 在 Scikit-Learn 特征提取中合并 CountVectorizer

    我是 scikit learn 的新手 需要一些帮助来完成我一直在做的事情 我正在尝试使用多项式朴素贝叶斯分类对两种类型的文档 例如 A 型和 B 型 进行分类 为了获取这些文档的术语计数 我在 sklearn feature extrac
  • 将值插入php多维数组

    如何在 php 中将值插入多维数组 我需要使用 while 循环向数组添加越来越多的行 这是我的代码 size 10 p 0 while p lt size myarray array array number gt data p data
  • Passport-Local 和 deSerializeUser 问题的简单身份验证

    阅读此处有关如何在 Passport 流程中反序列化和序列化用户工作的精彩描述后 了解护照序列化反序列化 https stackoverflow com questions 27637609 understanding passport s
  • Infinispan:如何将嵌入式缓存和独立服务器结合在一个集群中?

    作为概念证明 我尝试使用现有应用程序构建一个 infinispan 集群 该应用程序启动嵌入式缓存和一个或多个独立的 infinispan 服务器 我想展示的背后原因是 有一种通过简单启动新下载的 infinispan 独立服务器来零配置自
  • 如何防止在前置时滚动?

    我将内容添加到正文的顶部 有时该内容的高度可能为 400 500 像素 当添加类似的内容时 在阅读页面时将内容向下推可能会非常烦人 我希望这些项目自动添加到前面 而不是像单击此处查看新项目那样 有没有办法在不移动页面的情况下将此内容添加到正
  • PHP DomDocument 编辑所有链接

    我使用以下代码从另一个页面获取 html 并将其放入我的 php 页面中 doc new DomDocument We need to validate our document before refering to the id doc
  • 在 AngularJS 应用程序中使用 select2 插件

    我在 AngularJS 应用程序中使用 select2 插件来显示一些实体 标签 的列表 这是我的模板的部分 select ddlTags ui select2 select2Options multiple ng model link
  • 使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

    我对 swift 比较陌生 并尝试使用 Apple 的 RoomPlan API 创建内部没有任何对象的房间的渲染 为此 我要获取由以下给出的墙列表CapturedRoom walls并使用给定的信息创建一系列 SCNNode 这样我就可以
  • 以编程方式更改 mac osx 上的代理

    如何以编程方式更改 mac osx 上的代理设置 我对ios很流利 而且由于mac os编程类似 所以应该不会有太多问题 然而 我缺乏以编程方式创建代理更改所需的逻辑 手动调整非常容易 这是我所追求的系统偏好设置中的网络选项卡 我尝试过的
  • Android 检查指纹扫描仪可用[重复]

    这个问题在这里已经有答案了 如果指纹扫描仪可用 让用户通过指纹验证来使用我的应用程序功能 试试这个代码 FingerprintManager fingerprintManager FingerprintManager context get
  • 如何让Netcat显示数据包的有效负载

    我不知道这是否可能 但我想知道 我正在做一些内部渗透测试并使用 Scapy 和 Netcat 并且我创建了一个带有有效负载 testing 的 TCP 数据包 我想使用以下示例代码将有效负载内容通过管道传输到 Netcat 的侦听端口 te
  • CSS3 resize 属性只允许增加 DIV 大小

    有一个resizeCSS3 中的属性可以应用于div e g http www impressivewebs com css3 resize http www impressivewebs com css3 resize 我正在构建一个丰富
  • JavaFX 图表自动缩放错误且数字较低

    我正在使用 JavaFX 构建 StackedBarChart 随着新数据的进入 图表将发生变化 我使用更新图表的按钮来模拟这一点 它大部分工作正常 但我注意到 当我第一次更新图表时 如果值较低 值小于 100 Y 轴标签似乎有点偏离 更奇
  • 使用 Linq 左连接两个列表并从右侧维护一个属性

    我有 2 个列表同类型 左侧列表 var leftList new List
  • Python 多处理进程在一段时间后休眠

    我有一个脚本 它运行一个目录 并搜索具有给定结尾 即 xml 的所有文件以查找给定字符串并替换它们 为了实现这一点 我使用了 python 多处理库 作为示例 我使用 1100 个 xml 文件 其中包含大约 200MB 的数据 在我的 M