2011-02-14 52 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)你应该让你的接收器超时,检查在循环终止标志。