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