<p>您应该使用全局变量作为保护:到达该执行点的第一个线程将设置该变量,其他线程在看到已设置该变量时,跳过该代码段:</p>
<pre><code>def getIP(self,commandline):
"""
A thread that sets an IP using the method specified in commandline
"""
global guard
getter_process = subprocess.Popen(commandline,stdout=subprocess.PIPE)
myip = getter_process.communicate()[0].decode(encoding="ascii", errors="ignore").replace("\n","")
print("getIP with ", commandline, " result:" , myip)
if isIP(myip) and not guard:
self.lock1.acquire()
try:
GLib.idle_add(self.setIndicatingMenus,myip,self.hIndicator)
guard = True
finally:
self.lock1.release()
print("debug2")
print("getIP end")
return False
def askIP(self,ind):
"""
Start subprocesses asking for external IP in separate threads
"""
global guard
guard = False
print("askIP start")
#list of commandlines that are supposed to return IP as a result
IPgettingMethods = [
["dig", "+short", "myip.opendns.com", "@resolver1.opendns.com"],
["dig", "+short", "myip.opendns.com", "@resolver1.opendns.com"],
# and other command line commands I may want in separate threads
]
for i in IPgettingMethods:
th = Thread(target=self.getIP, args=(i,))
th.start()
return False
</code></pre>
<p>“手动”终止线程几乎从来都不是一个好主意。当他们到达函数的末尾时,让他们死去,通过设置一个守卫来阻止他们工作。你知道吗</p>