2011-02-14 77 views
0

更新的帖子 於是,我找到了一個解決方案,我在做什麼是用Is there any way to kill a Thread in Python?Python的線程設計問題

我想獲得一些設計驗證(與永遠塊的方法工作) 。我們有一個相當大的系統,系統的一個組件是通信組件。它負責兩件事情,一個發送消息,兩個排隊等待收到的消息(文件,數據庫,隊列等)。我通過提供的庫接收消息,基本上可以永遠等待消息到達。

問題:

1)它是最好能有一個主線程,和兩個子線程?

2)它是更好地使接收線程只是永遠阻塞,直到消息到達?或者我應該允許它超時(這是一個例外),並繼續循環?

讓我知道你可能需要的任何詳細信息。

現在我基本上有一個接收線程和主線程(也可以用來處理髮送),你可以看到下面。下面不包含的唯一的東西是我現在可以在MessageReceiver上調用「終止」的功能,它將退出。


原帖 我想在python環繞一些接收邏輯線程。基本上我們有一個應用程序,在後臺輪詢消息時會有一個線程,我遇到的問題是那些實際上拉動消息等待消息的消息。讓它無法終止...我最終把拉包裝在另一個線程中,但我想確保沒有更好的方法來做到這一點。

原始代碼:

class Manager: 
    def __init__(self): 
     receiver = MessageReceiver() 
     receiver.start() 
     #do other stuff sending/etc... 

class MessageReceiver(Thread): 
    receiver = Receiver() 

    def __init__(self): 
     Thread.__init__(self) 


    def run(self):   
     #stop is a flag that i use to stop the thread... 
     while(not stopped): 
      #can never stop because pull below blocks 
      message = receiver.pull() 
      print "Message" + message 

我知道存在明顯的鎖定問題,但這是控制接收線程永遠等待消息的適當方法?

我注意到的一件事是這件東西在等待消息時吃了100%cpu ...... **如果你需要查看停止邏輯,請讓我知道,我會發布。

+0

請問您可以發佈`Receiver`的代碼嗎? – 2011-02-14 22:20:24

+0

對我們來說,接收器是一個黑盒子,基本上需要1個參數「超時」。正如我下面所說的,我們希望這件事情永遠等下去,除非我們決定關閉程序,那麼我們需要一種能夠停止拉動的方式。 – Nix 2011-02-15 02:14:59

+0

你能告訴我們關於`Receiver`的一切嗎?你知道'pull()'是CPU限還是IO限?如果不知道明顯的原因,就很難猜出問題所在。 – 2011-02-15 03:34:33

回答

0

因爲從來就沒有真正回答這個問題,我會總結:

  1. 一個主線程負責處理信息的發送,併產生一個接收線程
  2. 永遠阻止,例外的是昂貴的,所以無需讓它超時。

爲了停止線程,我基本上設置了停止標誌,然後在父節點的「終止」消息中終止底層連接。作爲回報,導致孩子出現異常。

在異常處理塊中,我檢查ConnectionException,如果已經設置了「stop」標誌,我優雅地停止接收線程,如果它是一個非正常的退出,我會通知父線程。

希望這可以幫助,這是一個超級煩人的問題,但我很高興它結束了。

class Manager: 
    def __init__(self): 
     self.receiver = MessageReceiver(shutdown_hook = self.shutdown_hook) 
     self.receiver.start() 
     #do other stuff sending/etc... 
    def terminate(self): 
     self.receiver.stop() 
     self.receiver.close() 

    def shutdown_hook(self, t_id, child): 
     print '%s - Unexpected thread shutdown, handle this.. restart thread?' % str(t_id)) 

class MessageReceiver(Thread): 


    def __init__(self,shutdown_hook = None): 
    Thread.__init__(self) 
    self.receiver = Receiver() 
    self.shutdown_hook = shutdown_hook 


    def run(self):   
    #stop is a flag that i use to stop the thread... 
    while(not stopped): 
     try: 
     message = self.receiver.pull() 
     print "Message" + message 
     except ConnectionException as e: 
     if stopped: 
      #we are in the process of stopping 
      pass 
     else: 
      self.shutdown_hook(self.iden, e) 
      break 
     finally: 
      receiver.close() 
0

1)如果你的第三個線程只是要對接收者和發送者的等待,也沒有必要。

與多個進程工作比多個線程不太方便。進程的一大優點是它們避免了CPython在線程方面的限制,也就是說,兩個線程當時無法進行處理(但一個線程可以運行,其他線程則可以運行,而另一個線程則可以阻止IO)。因此,除非兩個線程都可以進行大量處理,否則最好讓它們保持在同一個進程中。

2)你應該讓你的接收器超時,檢查在循環終止標誌。