我在 Django 应用程序中有两个单独的 subprocess
调用,每个都在不同的 View 中。首先调用dcraw图片转换工具,将上传的raw图片转为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()
我的问题:对于这两个子进程调用,我必须手动重新加载 View 才能真正运行。 “围绕”它们的其余代码运行良好。关于如何避免这种情况的任何想法?我想知道这是否是某种缓存问题,因为我已经能够让第一个子进程在开始需要重新加载之前运行几次。非常感谢您的见解!先感谢您。
我尝试过的事情:
- 在子进程周围插入
time.sleep
,认为它可能被缩短了。不起作用。 - 为
stdout
使用管道而不是None
。我认为我应该使用None
,因为我不需要从命令中读取结果(它们只是将图像输出到 args 中指定的目录)。 - 咒骂它。仍在进行中。
最佳答案
因为子进程的整个概念是异步的,所以当您的 View 被解析到浏览器时它不会就绪。
也许您发出 Ajax 请求来检查进度状态,一旦文件可用,服务器就会发送它们。
或者您使用 WebSockets,它可以在数据可用时立即发送任何数据,无需额外请求,同时保证超快速响应。
关于python - 为什么我的子进程调用需要重新加载页面才能执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289741/