【发布时间】:2012-06-07 18:44:21
【问题描述】:
我有一个 python 框架,它必须将 bash 脚本作为插件执行。 我们使用 multiprocessing 模块创建工作进程,从 multiprocessing.JoinableQueue 中挑选插件详细信息并使用 subprocess.Popen() 执行插件。
据观察,shell 脚本生成的最终输出会被截断,最终导致整个执行过程浪费。
所以我们尝试转移到 python 线程,让维护子进程机制的工作人员生成 shell 脚本进程。并且截断不再发生。但是线程非常慢(由于 GIL),并且对信号和事件的响应也是不确定的(可能是由于 GIL 的发布时间)。
我在很多地方都读过,包括 stackoverflow 中的其他问题,多处理模块对标准输出进行缓冲。我们知道这是问题所在。但是无法找到合适的解决方案,因为我们无法从 python 中为 sys.stdout.flush 提供 shell 脚本必须回显到文件的数据。
我们还用一些样本尝试了 os.fsync,但没有发生截断。同样,它不能直接用于我们的目的,因为框架不知道由 shell 脚本创建的文件的名称。框架只取回最终存档。
我的问题是,有什么方法可以防止在多处理模块产生的进程中出现这种缓冲? python解释器的-u选项在这里有帮助吗?或者对 /usr/lib64/python2.6/multiprocessing 中的 python 库进行任何修改会解决这个问题吗?
【问题讨论】:
标签: python subprocess multiprocessing