【问题标题】:Python multi-threading: How to keep daemon thread runningPython多线程:如何保持守护线程运行
【发布时间】:2012-03-21 17:46:01
【问题描述】:

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

创作:

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 主体永远不会被执行。有人可以向我解释为什么会这样吗?运行一个执行需要一直忙的事情的线程的最佳方法是什么?非常感谢。

【问题讨论】:

    标签: python multithreading python-daemon


    【解决方案1】:

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

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

    总的来说,我会说你是对的。这应该有效。事实上,这并不意味着你的假设是错误的。

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

    【讨论】:

      【解决方案2】:

      我的一些信息是几个月前的,情况可能已经改变,所以请多多包涵。

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

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

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

      恕我直言,我选择 Python 是用 Python 而非 C 编写软件,除非必须解决一个非常具体的问题。 Python 在很多事情上都是一门出色的语言,但 GIL 的限制鼓励我学习一种能够支持更好的事件同步的语言,也就是多线程环境。

      我希望这会有所帮助。

      【讨论】:

      • 感谢您的信息。你是不是建议既然 GIL 适用于同一进程的多个线程,我不应该以我的方式这样做?
      • 我绝不是 Python 专家。我只是建议您深入研究 GIL 限制。 GIL 限制在去年的 The Boston Python Meetup 中进行了讨论,因此从那时起情况可能已经发生了变化。我没有进一步研究它。我仍然在很多事情上使用 Python,因为它是一门很好的语言并且有很多支持。
      • 据我所知,GIL 与 OP 问题无关。只有当你有多个处理器时,GIL 才会真正发挥作用,它会阻止解释器一次使用多个处理器。所有线程仍然会运行到完成,它们只会被解释器调度为交错运行(就像线程总是在单个处理器上运行一样)。
      • 我根据自己在 stackoverflow 中的知识和答案进行了回答,例如 stackoverflow.com/questions/7404904/… 。我的回答基本上是,使用进程而不是线程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多