为什么我的子进程调用需要执行页面重装?

问题描述:

我有一个Django应用程序中的两个独立的subprocess调用,每个调用都在不同的视图中。第一个调用dcraw图像转换工具来获取上传的原始图像并将其转换为tiff。 (该输出.TIFF通常比输入大九倍,例如8MB图像产量72MB TIFF。)为什么我的子进程调用需要执行页面重装?

pdcraw = subprocess.Popen(dcraw_args, stdout=None, stderr=None) 
pdcraw.communicate() 

我的第二子过程调用一个MATLAB脚本,其处理TIFF和输出相关的数据文件和图像。当我自己运行脚本时,这个调用通常需要15-20秒。

result = subprocess.Popen(matlab_args, stdout=None, stderr=None) 
result.communicate() 

我的问题:与这两个子进程调用,我必须手动重新加载视图为他们实际运行。其余的代码“围绕”他们运行良好。有关如何避免这种情况的任何想法?我想知道这是否是某种缓存问题,因为在开始需要重新加载之前,我已经能够让第一个子进程运行几次。非常感谢您的洞察力!先谢谢你。

事情我已经尝试:

  • 插入周围的子流程time.sleep,心想也许它剪短。不起作用。
  • 使用管道代替None代替stdout。我想我应该使用None,因为我不需要从命令中读取结果(它们只是将图像输出到参数中指定的目录)。
  • 诅咒它。仍在进行中。

因为子进程的整个思想是异步的,所以当你的视图解析到浏览器时,它不会准备好。

也许你做了一个Ajax请求来检查进度的状态,只要文件可用,它们就可以被服务器发送。

或者您使用WebSockets,它可以在可用时立即发送任何数据,在保证超快响应的同时省略额外的请求。

+1

Remi,他调用'communicate()'它实际上等待进程终止,所以它不是异步的。 – 2011-09-02 22:56:59

+0

感谢您的回复,Remi。根据你的解释,即使在解析视图之后,子过程是否仍然运行?理论上,我的子进程调用会创建一对文件;除非我重新加载,否则这根本不会发生。 –

+0

我发现了一个类似的问题[here](http://*.com/questions/2420471/django-subprocess)。这个人实例化一个'Process'并使用'.join'来产生'communic'应该做的事情,并且成功。另一方面,直接发送视图并稍后发送结果比不得不等待... @Cianan,还尝试了原始的'threading',成功报告[here](http://www.artfulcode .net/articles/threading-django /#comment-2079) – Remi