Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python多处理模块缓冲/截断文件的Shell脚本输出_Python_Subprocess_Multiprocessing - Fatal编程技术网

使用python多处理模块缓冲/截断文件的Shell脚本输出

使用python多处理模块缓冲/截断文件的Shell脚本输出,python,subprocess,multiprocessing,Python,Subprocess,Multiprocessing,我有一个python框架,它必须作为插件执行bash脚本。 我们正在使用multiprocessing模块创建工作进程,这些工作进程从multiprocessing.JoinableQueue中选择插件详细信息,并使用subprocess.Popen()执行插件 据观察,shell脚本生成的最终输出会被截断,最终导致整个执行过程被浪费 因此,我们尝试转移到python线程,让维护子进程机制的工作人员生成shell脚本进程。而截断不再发生。但是线程非常慢(由于GIL),对信号和事件的响应也不确定(

我有一个python框架,它必须作为插件执行bash脚本。 我们正在使用multiprocessing模块创建工作进程,这些工作进程从multiprocessing.JoinableQueue中选择插件详细信息,并使用subprocess.Popen()执行插件

据观察,shell脚本生成的最终输出会被截断,最终导致整个执行过程被浪费

因此,我们尝试转移到python线程,让维护子进程机制的工作人员生成shell脚本进程。而截断不再发生。但是线程非常慢(由于GIL),对信号和事件的响应也不确定(可能是由于GIL释放时间)

我在很多地方读过,包括stackoverflow中的其他问题,多处理模块对标准输出进行缓冲。我们知道这就是问题所在。但是我们无法找到合适的解决方案,因为我们无法从python中为shell脚本必须回显到文件的数据提供sys.stdout.flush

此外,我们还使用一些示例尝试了os.fsync,但没有发生截断。同样,它不能直接用于我们的目的,因为shell脚本创建的文件的名称对于框架来说是未知的。框架只收回最终归档


我的问题是,有没有办法防止多处理模块产生的进程中出现这种缓冲?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 选项。)