使用python多处理模块缓冲/截断文件的Shell脚本输出
我有一个python框架,它必须作为插件执行bash脚本。 我们正在使用multiprocessing模块创建工作进程,这些工作进程从multiprocessing.JoinableQueue中选择插件详细信息,并使用subprocess.Popen()执行插件 据观察,shell脚本生成的最终输出会被截断,最终导致整个执行过程被浪费 因此,我们尝试转移到python线程,让维护子进程机制的工作人员生成shell脚本进程。而截断不再发生。但是线程非常慢(由于GIL),对信号和事件的响应也不确定(可能是由于GIL释放时间) 我在很多地方读过,包括stackoverflow中的其他问题,多处理模块对标准输出进行缓冲。我们知道这就是问题所在。但是我们无法找到合适的解决方案,因为我们无法从python中为shell脚本必须回显到文件的数据提供sys.stdout.flush 此外,我们还使用一些示例尝试了os.fsync,但没有发生截断。同样,它不能直接用于我们的目的,因为shell脚本创建的文件的名称对于框架来说是未知的。框架只收回最终归档使用python多处理模块缓冲/截断文件的Shell脚本输出,python,subprocess,multiprocessing,Python,Subprocess,Multiprocessing,我有一个python框架,它必须作为插件执行bash脚本。 我们正在使用multiprocessing模块创建工作进程,这些工作进程从multiprocessing.JoinableQueue中选择插件详细信息,并使用subprocess.Popen()执行插件 据观察,shell脚本生成的最终输出会被截断,最终导致整个执行过程被浪费 因此,我们尝试转移到python线程,让维护子进程机制的工作人员生成shell脚本进程。而截断不再发生。但是线程非常慢(由于GIL),对信号和事件的响应也不确定(
我的问题是,有没有办法防止多处理模块产生的进程中出现这种缓冲?python解释器的-u选项在这里有用吗?或者对/usr/lib64/python2.6/multiprocessing中的python库进行任何修改都可以解决这个问题吗?我们发现,脚本中通过ssh发送的命令是在输出中被截断的命令 为此,我们使用了ssh的-n标志,解决了这个问题。不再有截断。 但这是一个奇怪的问题,它只发生在python多处理环境中,任何试图为自己的目的使用这种模型的人都必须认真考虑 n选项的手册页显示 从/dev/null重定向stdin(实际上,阻止从 stdin)。在后台运行ssh时必须使用此选项。A. 常见的技巧是使用它在远程计算机上运行X11程序 机器。例如,ssh-n shadows.cs.hut.fi emacs&will 在shadows.cs.hut.fi上启动emacs,X11连接将 通过加密通道自动转发。宋承宪 程序将放在后台。(如果 ssh需要请求密码或密码短语;另请参阅-f 选项。)