1
我有一些虚拟代码放在一起,启动一个进程(exist_view),它调用一个shell脚本,然后通过状态页面循环,定期检查以查看进程是否产生了返回代码,然后渲染结果。如何用金字塔优雅地处理python子进程
但是,我得到的结果是,子进程会锁定客户端上的呈现,直到它完成为止,这会呈现'客户端的定期状态更新'模拟。我真的需要能够向客户展示正在进行的事情,因为最终项目会有几个连续的子过程运行,其中一些可能需要几分钟时间(这是针对定制设备,而不是某个网站)。下面的代码片段。有什么建议么?
请注意,我正在使用Python 2.6.5和Pyramid 1.4。
@view_config(route_name='waiting', renderer='waiting.mako')
def waiting_view(request, process):
while process.poll() == None:
time.sleep(1)
print str(process.returncode)
return {}
@view_config(route_name='exist', renderer='exist.mako')
def exist_view(request):
process = subprocess.Popen(['bash', '-c', './dummy.sh'], stdout=subprocess.PIPE)
return HTTPFound(request.route_url('waiting', process=process))
这里有不止一种方法。另外,它不是金字塔/ Python专有的。一种方法(可能是最简单的方法,但不是最简洁的方法)是将任务的进度保存在某个地方(如数据库),并使用ajax请求在前端轮询。更复杂的方法是使用消息队列,工作者以及某种方式将通知推送到客户端(例如,Server-Sent Events或WebSocket)。 – 2013-04-23 12:42:22