子进程+多重处理-按顺序执行多个命令

2024-06-09

我有一组命令行工具,我想在一系列文件上并行运行。我写了一个 python 函数来包装它们,看起来像这样:

def process_file(fn):
    print os.getpid()
    cmd1 = "echo "+fn
    p = subprocess.Popen(shlex.split(cmd1))

    # after cmd1 finishes
    other_python_function_to_do_something_to_file(fn)

    cmd2 = "echo "+fn
    p = subprocess.Popen(shlex.split(cmd2))
    print "finish"

if __name__=="__main__":
    import multiprocessing
    p = multiprocessing.Pool()
    for fn in files:
        RETURN = p.apply_async(process_file,args=(fn,),kwds={some_kwds})

虽然这有效,但它似乎并没有运行多个进程;看起来它只是串行运行(我尝试过使用Pool(5)具有相同的结果)。我缺少什么?是否致电Popen“封锁”?

编辑:澄清一点。我需要 cmd1,然后是一些 python 命令,然后是 cmd2,以便在每个文件上按顺序执行。

EDIT2:上面的输出具有以下模式:

pid
finish
pid
finish
pid
finish

而类似的调用,使用map代替apply(但没有任何通过的规定kwds)看起来更像

pid
pid
pid
finish
finish
finish

然而,地图调用有时(总是?)在明显成功后挂起


是否致电Popen“封锁”?

不,只是创建一个subprocess.Popen立即返回,为您提供一个可以等待或以其他方式使用的对象。如果你想阻止,很简单:

subprocess.check_call(shlex.split(cmd1))

同时,我不确定为什么你要把你的参数放在一个字符串中,然后尝试shlex他们回到一个列表。为什么不直接写清单呢?

cmd1 = ["echo", fn]
subprocess.check_call(cmd1)

虽然这有效,但它似乎并没有运行多个进程;看起来它只是串行运行

是什么让你这么想?鉴于每个进程只是尽快将两个进程启动到后台,因此很难判断它们是否并行运行。

如果您想验证是否从多个处理中获得工作,您可能需要添加一些打印或日志记录(并抛出类似的内容os.getpid()到消息中)。

同时,看起来您正试图完全复制以下效果multiprocessing.Pool.map_async脱离循环multiprocessing.Pool.apply_async,除了不是累积结果,而是将每个结果存储在名为的变量中RESULT然后在使用之前将其扔掉。为什么不直接使用map_async?

最后,你问是否multiprocessing是适合这项工作的工具。好吧,你显然需要一些异步的东西:check_call(args(file1))必须阻止other_python_function_to_do_something_to_file(file1),但同时不阻塞check_call(args(file2)).

我可能会用threading,但实际上,这并没有多大区别。即使您所在的平台上进程启动成本很高,您也已经付出了这笔成本,因为重点是运行 N * M 组子进程,因此另外 8 个子进程池不会造成任何损害。而且,通过在线程之间共享数据而意外创建竞争,或者意外地创建看起来像是在进程之间共享数据但实际上没有共享数据的代码的风险很小,因为没有任何内容可以共享。所以,无论你更喜欢哪一个,就去吧。

另一种选择是编写一个事件循环。我实际上可能会开始自己解决这个问题,但我会后悔的,而且你不应该这样做......

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

子进程+多重处理-按顺序执行多个命令 的相关文章

随机推荐

  • R:在因素对之间进行 t 检验

    我有一个 R 数据框 其中因子变量有 8 个级别 有序 我想在级别 1 和 2 3 和 4 5 和 6 以及 7 和 8 之间进行 t 检验 虽然我可以对数据进行子集化以提取每对类别 但我想知道是否有更简单的方法它 想不通 尝试了以下方法
  • 在ubuntu中使用gcc生成特定频率的声音?

    如何在 C C 中生成特定频率的声音 我运行 Ubuntu 10 04 并使用 gcc 有一个void sound int frequency Windows 版 TurboC 上的功能 gcc 有等效的吗 下面是利用 PortAudio
  • 从 Chrome 应用程序在浏览器中打开选项卡

    自从获得许可 tabs and chrome tabsChrome 应用程序中不提供 API 如何在浏览器中打开具有指定 URL 的选项卡 尝试动态创建一个链接并调用它click method function openTab url va
  • Rails Bundle,gems 冲突,解决它的最佳方法

    我在使用 Bundle 解决宝石冲突时遇到了麻烦 无法激活 activemodel 3 0 8 actionpack 3 0 8 railties 3 0 8 的构建器 gt 2 1 2 运行时 已激活 的 builder 3 0 0 黄瓜
  • 如何测试 Angular 2 ErrorHandler 实现?

    我已经覆盖了 angular core ErrorHandler 并且我正在尝试测试它 但是我收到了一个错误 服务工作正常 但测试在某处失败 异常处理程序 service ts import Injectable ErrorHandler
  • 查找所有n位相邻数字为1的n位二进制数[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 让我用一个例子来解释一下 如果n 4
  • 将组“Everyone”添加到目录及其所有子目录

    我目前使用的是 Vista 32 位 如何添加 Windows 安全组 Everyone 并完全控制目录及其所有子目录和所有文件 有我可以使用的 powershell 脚本吗 Thanks 我已经扩展了 martona 的代码片段 并且能够
  • Nativescript:如何以编程方式禁用/启用 ScrollView 滚动?

    有没有办法以编程方式禁用 启用 NativeScript 中的 ScrollView 滚动 好的 我找到了该怎么做 在 iOS 上这实际上非常简单 var scrollView page getViewById YOUR VIEW ID s
  • 从 mongoDB 获取数据并在 HTML 上显示

    我无法理解如何从 MongoDB 数据库获取数据并将其显示在 HTML 上 我已经设置了数据 这是 server js 文件 const path require path const express require express con
  • 是否可以以编程方式构造 std::initializer_list?

    我正在包装以下形式的 C fn foo input std initializer list
  • 流多播 - 读取一次流,但以不同的方式处理它,并使用最少的缓冲

    为了可扩展性和节省资源 最好避免将整个输入流读入内存 而是尝试将其作为流处理 一次读取小块 当您想要对数据执行一件事 例如从 Web 请求中读取数据并将其保存到文件中 时 这在 NET 中很容易实现 简单的例子 input CopyTo o
  • 如何将 int numpy 数组的列乘以浮点数字并保持 int 形式?

    我有一个 numpy 数组 gt gt gt b array 2 2 6 4 10 6 我想将第一列乘以浮点数 结果我需要 int 数字 因为当我这样做时 gt gt gt b 0 2 1 It says TypeError Cannot
  • 从图中删除节点或重置整个默认图

    使用默认全局图时 是否可以在添加节点后将其删除 或者将默认图重置为空 当我在 IPython 中交互地使用 TF 时 我发现自己必须反复重新启动内核 如果可能的话 我希望能够更轻松地尝试图表 更新 11 2 2016 tf reset de
  • Windows Azure Active Directory 备份/恢复 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种备份 恢复 Windows Azure Active Directory 以防止用户错误的方法 我认识到 Azure 的强大
  • Uri.parse("文件://" + ???);访问特定文件夹

    我的问题分为两部分 如何获取以下代码来访问此位置 存储 模拟 0 电影 特定文件夹 Code private Uri getUriFromMediaStore int position int dataIndex mMediaStoreCu
  • 在 Visual Studio 中引用同一解决方案中的项目

    我有一个包含两个项目的解决方案 其中一个项目是一个带有 DLL 文件的库 我希望能够在其他项目中引用该项目库以使用其类 我的最终目标是做到这一点 同时仍然可以访问库源代码 我尝试过引用 dll 也尝试过引用 csproj 这两种情况都有效
  • 如何从Azure配置文件获取所有配置设置?

    我需要从 Azure cscfg 文件获取所有配置设置 当前角色或所有角色都无关紧要 我想这样做是因为我不想通过 RoleEnvironment GetConfigurationSettingValue key 方法一一获取所有值 有什么办
  • 服务器端MVC+客户端MVC

    一个应用程序既是JS密集型的 又具有复杂的业务逻辑 庞大的数据流 使用backboneJS来构造JavaScript代码 并且还需要服务器端MVC 在本例中是Spring 与客户端 MVC 主干 一起实现服务器端 MVC spring 是一
  • 如何以角度形式创建传单地图

    我的要求是以角度形式创建传单地图 但我对这种形式很陌生 我知道如何将地图与普通 html 结合使用 如下所示 地图组件 ts ngOnInit const map L map map setView 51 509865 0 118092 1
  • 子进程+多重处理-按顺序执行多个命令

    我有一组命令行工具 我想在一系列文件上并行运行 我写了一个 python 函数来包装它们 看起来像这样 def process file fn print os getpid cmd1 echo fn p subprocess Popen