Python多线程:如何让守护进程线程运行
我困住了一个棘手的问题来测试守护进程线程是否正在运行。该守护线程我做了应该在后台保持运行的服务运行的,所以我下面要创建它,并让它活着: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
的身体是否永远不会被执行。有人可以向我解释为什么会发生这种情况?运行线程的最佳方式是执行一些需要一直忙碌的事情?非常感谢。
发表的代码不加起来。 initAirserv
由于发布是一个类的方法,但initAirserv
传递给Thread
的构造函数不是。
如果不知道execAirmon
和init_Plug
的作用,以及在您的应用程序中发生了什么,也很难说具体的东西。
一般来说,我会说你说得对。这应该工作。这并不意味着你的假设是错误的。
- 你确定
execAirmon
返回的东西不等于“删除”? - 你确定
init_Plug
返回一个非错误的对象吗? - 你确定没有例外吗? (我假设你会注意到一个虚假的堆栈跟踪,那么你的应用程序中是否有其他部分可能会被他人忽视?)
我的一些信息有几个月了,事情可能已经改变了,所以请耐心等待。
如果您使用的是基于标准C的Python并正在编写多线程应用程序,则需要了解全局解释器锁(GIL)限制。这是一次只能运行一个线程。如果您愿意使用Python C接口包之一并在C中编写大量代码,则函数调用的C部分可以进行线程化处理,并且不受GIL限制。
Python具有出色的多进程支持和库,并且因为您正在同步进程,所以GIL限制不适用。
有关于修复GIL限制的讨论,但现在这是一个你必须接受的问题。
恕我直言,我选择了Python来编写Python中的软件,而不是C,除非必须解决一个非常具体的问题。 Python对许多事情来说都是一种很好的语言,但GIL限制鼓励我学习一种支持更好的事件同步的语言,也就是多线程环境。
我希望这会有所帮助。
感谢您的信息。你是否暗示,因为GIL适用于多个线程的同一过程,我不应该这样做吗? – 2012-03-21 18:16:43
我绝不是Python专家。我只是建议你只做一些挖掘GIL的限制。在去年的波士顿Python Meetup会议上讨论了GIL限制,因此事情可能会发生变化。我没有进一步研究过它。我仍然使用Python来做很多事情,因为它是一门很好的语言,并且有很多支持。 – octopusgrabbus 2012-03-21 18:36:11
我不清楚这是如何回答OP的问题。 – 2012-03-21 18:51:07