2012-03-21 185 views
2

我困住了一個棘手的問題來測試守護進程線程是否正在運行。該守護線程我做了應該在後臺保持運行的服務運行的,所以我下面要創建它,並讓它活着:Python多線程:如何讓守護進程線程運行

創作:

ASThread = threading.Thread(target = initAirserv, args=[],) 
ASThread.setDaemon(True) 
ASThread.start() 

裏面的initAirserv()方法:

def initAirserv(self, channel="15"): 
     interface = self.execAirmon(options="start", interface=self.interface) 
     port = self.plug_port 
     if interface != "removed": 
      if channel=="15": 
       command = "airserv-ng -d " +str(interface)+" -p "+str(port) 
      else: 
       command = "airserv-ng -d " +str(interface)+" -p "+str(port)+" -c"+str(channel) 
     else: 
      return None 
     AServConn=self.init_Plug() 
     if AServConn: 
      (stdin, stdout, stderr) = AServConn.exec_command(command) 
      serv_op = stdout 
      serv_er = stderr 
      ##### keep the daemon thread run persistently #### 
      a = 0 
      while 1: 
       a += 1 
     else: 
      logging.debug("SSH Error") 

最後幾行的目的是保持線程繁忙使用一種愚蠢的方式。然而,啓動後該守護線程和我做別的東西,當我回來了,檢查線如下:

if ASThread.is_alive() == 1: 
    # do something 

的身體是否永遠不會被執行。有人可以向我解釋爲什麼會發生這種情況?運行線程的最佳方式是執行一些需要一直忙碌的事情?非常感謝。

回答

2

發表的代碼不加起來。 initAirserv由於發佈是一個類的方法,但initAirserv傳遞給Thread的構造函數不是。

如果不知道execAirmoninit_Plug的作用,以及在您的應用程序中發生了什麼,也很難說具體的東西。

一般來說,我會說你說得對。這應該工作。這並不意味着你的假設是錯誤的。

  • 你確定execAirmon返回的東西不等於「刪除」?
  • 你確定init_Plug返回一個非錯誤的對象嗎?
  • 你確定沒有例外嗎? (我假設你會注意到一個虛假的堆棧跟蹤,那麼你的應用程序中是否有其他部分可能會被他人忽視?)
0

我的一些信息有幾個月了,事情可能已經改變了,所以請耐心等待。

如果您使用的是基於標準C的Python並正在編寫多線程應用程序,則需要了解全局解釋器鎖(GIL)限制。這是一次只能運行一個線程。如果您願意使用Python C接口包之一併在C中編寫大量代碼,則函數調用的C部分可以進行線程化處理,並且不受GIL限制。

Python具有出色的多進程支持和庫,並且因爲您正在同步進程,所以GIL限制不適用。

有關於修復GIL限制的討論,但現在這是一個你必須接受的問題。

恕我直言,我選擇了Python來編寫Python中的軟件,而不是C,除非必須解決一個非常具體的問題。 Python對許多事情來說都是一種很好的語言,但GIL限制鼓勵我學習一種支持更好的事件同步的語言,也就是多線程環境。

我希望這會有所幫助。

+0

感謝您的信息。你是否暗示,因爲GIL適用於多個線程的同一過程,我不應該這樣做嗎? – 2012-03-21 18:16:43

+0

我絕不是Python專家。我只是建議你只做一些挖掘GIL的限制。在去年的波士頓Python Meetup會議上討論了GIL限制,因此事情可能會發生變化。我沒有進一步研究過它。我仍然使用Python來做很多事情,因爲它是一門很好的語言,並且有很多支持。 – octopusgrabbus 2012-03-21 18:36:11

+0

我不清楚這是如何回答OP的問題。 – 2012-03-21 18:51:07