我正在编写一个简单的程序来关注几个地址。
我希望在程序运行时运行一个简单的文本光标动画。我成功地做到了。但是,我的问题是,在执行扫描的功能完成后,动画继续运行,直到我按下break键才会停止。
import os
import time
import sys
import itertools
import threading
hostname = [multiple site list]
def responder(hostname):
while True:
for item in hostname:
response = os.system("ping -q -c 1 -n > /dev/null 2>&1 " + item)
if response == 0:
time.sleep(2)
else:
print item, 'is DOWN!'
sys.exit()
def animate():
for c in itertools.cycle(['|', '\'']):
sys.stdout.write('\rscanning for bums > ' + c)
sys.stdout.flush()
time.sleep(0.1)
t = threading.Thread(target=animate)
t.start()
responder(hostname)
我知道代码可能有点乱,因为我已经完成了项目的一半,但是知道它是什么我可以改变以使动画在响应函数退出时停止?
答案 0 :(得分:1)
您需要将threading.Event
传递给animate
函数并在希望停止时设置它:
import os
import time
import sys
import itertools
import threading
hostname = ['bogus.org']
def responder(hostname, t, quit_flag):
while True:
for item in hostname:
response = os.system("ping -q -c 1 -n %s >> /dev/null 2>&1" % item)
if response == 0:
time.sleep(2)
else:
quit_flag.set()
t.join()
print "%s is DOWN!" % item
return
def animate(quit_flag):
for c in itertools.cycle(['|', '\'']):
if quit_flag.is_set():
print ""
break
sys.stdout.write('\rscanning for bums %s > %s' % (quit_flag.is_set(), c))
sys.stdout.flush()
time.sleep(0.1)
quit_flag = threading.Event()
t = threading.Thread(target=animate, args=(quit_flag,))
t.daemon = True
t.start()
responder(hostname, t, quit_flag)
我修改了你的responder
函数,以便它设置退出标志,加入animate
线程,打印消息,然后返回。这可以保证在打印消息之前完成animate
线程。
我意识到尝试使用常规变量不起作用,因为只有值传递给animate
函数。如果您不想使用threading.Event
,则可以使用单个元素数组或其他将通过引用传递的对象。