2012-03-21 163 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