Python多线程:如何保持守护进程线程运行

时间:2012-03-21 17:46:02

标签: python multithreading python-daemon

我遇到了一个棘手的问题,无法测试守护程序线程是否正在运行。我制作的守护程序线程应该在后台运行以保持服务运行,因此我执行以下操作来创建它并使其保持活动状态:

创建:

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

if body永远不会被执行。有人可以向我解释为什么会这样吗?运行一个执行需要一直忙的东西的线程的最佳方法是什么?非常感谢。

2 个答案:

答案 0 :(得分:2)

发布的代码没有加起来。发布的initAirserv是类上的方法,但传递给initAirserv构造函数的Thread不是。

如果不知道execAirmoninit_Plug做了什么,以及您的应用程序中还会发生什么,也很难说具体内容。

一般来说,我会说你做得对。这应该工作。这并不意味着你的假设是错误的。

  • 您确定execAirmon会返回不等于“已删除”的内容吗?
  • 您确定init_Plug会返回非假对象吗?
  • 您确定没有抛出异常吗? (我假设您会注意到一个虚假的堆栈跟踪,那么您的应用程序的其他部分是否会被忽视?)

答案 1 :(得分:0)

我的一些信息有几个月了,事情可能已经改变了,所以请耐心等待。

如果您使用的是基于标准C的Python并且正在编写多线程应用程序,则需要了解全局解释器锁定(GIL)限制。那只是一次可以运行一个线程。如果您愿意使用其中一个Python C接口包并在C中编写大量代码,则函数调用的C部分可以是线程化的,不受GIL限制。

Python具有出色的多进程支持和库,并且由于您正在同步进程,因此GIL限制不适用。

有关于修复GIL限制的讨论,但是现在这是一个你必须接受的问题。

恕我直言,除非必须解决一个非常具体的问题,否则我选择Python用Python编写软件,而不是用C编写软件。 Python是很多东西的优秀语言,但GIL限制鼓励我学习一种支持更好的事件同步的语言,也就是多线程环境。

我希望这会有所帮助。