我遇到了一个棘手的问题,无法测试守护程序线程是否正在运行。我制作的守护程序线程应该在后台运行以保持服务运行,因此我执行以下操作来创建它并使其保持活动状态:
创建:
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永远不会被执行。有人可以向我解释为什么会这样吗?运行一个执行需要一直忙的东西的线程的最佳方法是什么?非常感谢。
答案 0 :(得分:2)
发布的代码没有加起来。发布的initAirserv
是类上的方法,但传递给initAirserv
构造函数的Thread
不是。
如果不知道execAirmon
和init_Plug
做了什么,以及您的应用程序中还会发生什么,也很难说具体内容。
一般来说,我会说你做得对。这应该工作。这并不意味着你的假设是错误的。
execAirmon
会返回不等于“已删除”的内容吗?init_Plug
会返回非假对象吗?答案 1 :(得分:0)
我的一些信息有几个月了,事情可能已经改变了,所以请耐心等待。
如果您使用的是基于标准C的Python并且正在编写多线程应用程序,则需要了解全局解释器锁定(GIL)限制。那只是一次可以运行一个线程。如果您愿意使用其中一个Python C接口包并在C中编写大量代码,则函数调用的C部分可以是线程化的,不受GIL限制。
Python具有出色的多进程支持和库,并且由于您正在同步进程,因此GIL限制不适用。
有关于修复GIL限制的讨论,但是现在这是一个你必须接受的问题。
恕我直言,除非必须解决一个非常具体的问题,否则我选择Python用Python编写软件,而不是用C编写软件。 Python是很多东西的优秀语言,但GIL限制鼓励我学习一种支持更好的事件同步的语言,也就是多线程环境。我希望这会有所帮助。