2012-10-23 47 views
1

好了,所以這可能是一個有點非正統或者我只是愚蠢或兩者:)開始蟒蛇瓶在一個線程/進程和另一個守護旁邊

我想一個很簡單的設置,其中我在一個Process實例中啓動一臺瓶服務器,並在另一個實例中啓動一個小型的TFTP服務器。

#!/usr/bin/env python 
import bottle 
import sys 
import tftpy 
from multiprocessing import Process 

def main(): 
    try: 
     t = Process(target=bottle.run(host='0.0.0.0', port=8080)) 
     t.daemon = True 
     t.start() 
     t.join() 
     h = Process(target=tftpy.TftpServer('/srv/tftp').listen('0.0.0.0', 69)) 
     h.start() 
     h.join() 

    except KeyboardInterrupt: 
     sys.stdout.write("Aborted by user.\n") 
     sys.exit(1) 

if __name__ == "__main__": 
    main() 

除非我完全瘋狂,否則我會期待他們同時啓動。事實上,發生的事情是瓶子開始並鎖定整個事情。如果我退出瓶子,TFTP守護進程將啓動。

我也嘗試了類似的方法與threading模塊,大約有相同的結果。

我在做什麼錯?

回答

4

有幾個問題:

  • 你在主線程中調用run()。你應該傳遞參數在args代替:

    Process(target=bottle.run, kwargs=dict(host='0.0.0.0', port=8080)) 
    
  • 調用t.join(),該塊到t流程h.start前結束()。畢竟進程,而不是開始

  • 瓶加入,tftpy可能與多處理模塊兼容。你可以嘗試子模塊,如果是這樣
+0

調用'在主線程run'是問題。謝謝你,你睜開了眼睛,看到我剛剛俯視的一些非常明顯的東西! :) – favoretti

+1

附註:both和tftp都是IO綁定的,而不是CPU綁定的。線程應該足夠了,不需要產生額外的進程。 – defnull

+0

@defnull:如果沒有他們的合作,線程很難被殺死,他們不會正確釋放資源。 – jfs

0

好了,我不知道如果我理解你正在試圖完成的任務,但如果我是你,我會嘗試使用python-daemon package

我認爲無論是bottleTFTP可能被守護進程。 因爲你只在尋找一個簡單的測試,我想這在蟒蛇守護網頁給出的例子就足夠了。

如果你真的喜歡將守護進程的想法,我建議你還要尋找適合你的平臺的守護進程,這樣你有幾個工具來管理你的守護進程,使它們與發現的守護進程更相似在你的操作系統。

對於一些簡單的例子: http://troydhanson.wordpress.com/2012/08/21/minimal-sysvinit-launchd-and-upstart/

+0

如果我不清楚,請原諒我。我會確實守護神。但不是那兩個過程。我正在編寫自己的工具,它將嵌入瓶和TFTP以及_that_工具,我將確實使用'python-daemon'進行守護。我只是在尋找一種解決方案,在我自己的守護進程中將這兩者作爲獨立的線程/子進程運行。 – favoretti

+0

我是否應該簡單地刪除此答案,因爲它不會在問題中添加任何內容? –

+0

隨意離開它:)它可能會增加一些有關python daemonizing的更多信息。 – favoretti