[英]Python Threading difficulty
我正在开发一个小程序,它将显示一条加载消息,同时通过ping谷歌来检查你是否有正常运行的互联网。 但每当我尝试运行它时,它只会停留在小装载小发明上。 有任何想法吗?
所以我修复了加载Gizmo没有停止的问题,但现在我有另一个问题。 此来源是较大程序的片段,当程序确定您的互联网正常运行时,加载Gizmo将停止。 它应该ping一些网站,但它只是等待一秒然后退出。 有谁知道这是怎么回事?
import urllib2, time, threading
def ping():
try:
urllib2.urlopen("http://www.google.com")
network = 1
except IOError:
network = 0
def network_waiting():
while network == '?':
print "\r[*] Checking network availability.... \ ",
time.sleep(.07)
print "\r[*] Checking network availability.... |",
time.sleep(.07)
print "\r[*] Checking network availability.... /",
time.sleep(.07)
print "\r[*] Checking network availability.... -",
time.sleep(.07)
thread1 = threading.Thread(target = ping)
thread2 = threading.Thread(target = network_waiting)
thread1.start()
thread2.start()
关于如何实际定义和启动线程可能存在一些混淆。 您不能通过在变量名称中使用“thread”来创建线程。 您可以这样做的一种方法是创建一个知道调用ping和network_waiting方法的线程对象。 这是一个这样做的例子:
thread1 = threading.Thread(target = ping)
thread2 = threading.Thread(target = network_waiting)
thread1.start()
thread2.start()
如果您对其他教程感兴趣,请查看本教程 。
编辑:现在您已将调用修复为线程,请参阅上面的@vanza评论。 以下是将network
声明为全局变量的方法(讨论如下):
import urllib2, time, threading
network = '?'
def ping():
global network
try:
urllib2.urlopen("http://www.google.com")
network = 1
except IOError:
network = 0
def network_waiting():
global network
while network == '?':
print "\r[*] Checking network availability.... \ ",
time.sleep(.07)
print "\r[*] Checking network availability.... |",
time.sleep(.07)
print "\r[*] Checking network availability.... /",
time.sleep(.07)
print "\r[*] Checking network availability.... -",
time.sleep(.07)
thread1 = threading.Thread(target = ping)
thread2 = threading.Thread(target = network_waiting)
thread1.start()
thread2.start()
本质上,不使用global
关键字,Python认为在ping
方法中,您正在创建一个名为network
的本地变量并写入它,而不是覆盖全局范围内的network
变量。
print
语句打印到默认缓冲的stdout。 您可以使用stderr报告进度。 另外一个线程就足够了:
#!/usr/bin/env python2
import itertools
import sys
import threading
import time
import urllib2
def is_internet_up():
try:
urllib2.urlopen("http://stackoverflow.com", timeout=30).close()
except EnvironmentError:
return False
else:
return True
def show_spinner(msg):
def spin():
for c in itertools.cycle(r"\|/-"):
if stopped.is_set():
break
sys.stderr.write("\r%s %s" % (msg, c))
time.sleep(0.07)
stopped = threading.Event()
thread = threading.Thread(target=spin)
thread.daemon = True
thread.start()
return stopped.set
stop_spinner = show_spinner("[*] Checking network availability....")
isup = is_internet_up()
stop_spinner()
print("\rInternet is " + ("up" if isup else "down"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.