2012-06-26 41 views
4

我需要在我的Django站點中緊急使用,但由於時間限制,我無法做任何重大修改。這可能是最便宜的就地修改。如何在後臺放置進程,以免中斷返回?

如果我們只關注要麼buildrun ...

  1. 現在我得到的ID從build(或運行)回來。

  2. 所有沉重的工作現在在一個單獨的功能。

'

import multiprocessing as mp 
def main(): 
    id = get_build_id(....) 
    work = mp.Process(target=heavy_build_fn) 
    work.start() 
    return id 

如果我跑這在shell(我還沒有實際的Django應用程序測試此),直到work過程,其完成任務的終端不會完全結束。作爲一個網絡應用程序,我需要立即返回該ID。我可以在不中斷的情況下將work放置在背景上嗎?

謝謝。

我讀過這How do I run another script in Python without waiting for it to finish?,但我想知道其他方式來做到這一點,例如,堅持與MP。 Popen解決方案可能不是我想要的。


import multiprocessing as mp 
import time 

def build(): 
    print 'I build things' 
    with open('first.txt', 'w+') as f: 
     f.write('') 

    time.sleep(10) 
    with open('myname.txt', 'w+') as f: 
     f.write('3') 
    return 

def main(): 
    build_p = mp.Process(name='build process', target=build) 
    build_p.start() 
    build_p.join(2) 
    return 18 

if __name__ == '__main__': 

    v = main() 
    print v 
    print 'done' 

控制檯:

I build things 
18 
done 
| 

,並等待

終於

[email protected]:~$ python mp3.py 
I build things 
18 
done 
[email protected]:~$ 
+0

處理此問題的一種典型方法是使用工作隊列。在請求的地方填充隊列,並且可能使用由cron或其他調度程序啓動的單獨進程來佔用隊列。 – monkut

+0

我已更新我的帖子。如果你運行它,它會掛起,直到腳本完成。我可以看到回報價值,但我很害怕懸掛。 – user1012451

回答

3

刪除join()你可能有你想要的東西。 join()在返回之前等待進程結束。

該值將在子進程完成之前返回,但是,您的父進程將保持活動狀態,直到子進程完成。不知道這是否是你的問題。

此代碼:

import multiprocessing as mp 
import time 

def build(): 
    print 'I build things' 
    for i in range(10): 
     with open('testfile{}.txt'.format(i), 'w+') as f: 
      f.write('') 
      time.sleep(5) 


def main(): 
    build_p = mp.Process(name='build process', target=build) 
    build_p.start() 
    return 18 

if __name__ == '__main__': 

    v = main() 
    print v 
    print 'done' 

返回:

> python mptest.py 
18 
done 
I build things 

如果你需要允許進程結束,而子進程繼續在這裏檢查出的答案:

Run Process and Don't Wait

+0

謝謝。當我像你說的那樣刪除'加入'時,它仍然必須等待孩子結束。所以它擊敗了目的。所以我實際上可以將諸如'build'之類的函數傳遞給Popen進程?謝謝。 – user1012451

+0

現在..我可以看到回報。但是'build'這個過程已經失去了。它沒有繼續。 :( – user1012451

0

沒有,最簡單的方法來處理你想要的可能是使用一個消息代理。 Django芹菜是一個很好的解決方案。它會讓你排隊一個進程並將你的權利返還給用戶。你的過程中會再有人排隊

的順序來執行,我相信從Django中打開過程被綁定到他們讓你的看法會等待返回,直到你的進程被打開線程完成

+0

謝謝。問題是,這不僅是一個Django問題。這些繁重的工作是由非Django程序完成的。我試過'thread.start_new_thread'。它結束了,但我沒有看到任何東西從沉重的工作開始... – user1012451

相關問題