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