如何在Python中设置任意超时停止程序
举个例子,这段代码是可以正常运行的
import urllib
image = urllib.URLopener()
file_ = 1
name = 1
for i in range(1,1000):
try:
image.retrieve("http://mangawriter.com/pics/pic"+str(file_)+".jpeg","pic"+str(name)+".jpeg")
print "save file %s" %file_
name += 1
file_ += 1
except IOError:
file_ += 1
我该怎么做才能让它在花费了一段时间后停止运行,即使代码还在执行?请帮我想想办法。
3 个回答
0
这个方法对我来说真的很有效,而且非常简单。假设我们想在25秒后停止。
import timeit #we will need the command default_timer() that checks the actual time
start = timeit.default_timer()
while timeit.default_timer()-start<=25:
"you code here"
0
这不是最好的方法,但可以用得上:
你可以使用 threading
模块来创建一个子线程来完成这个任务,然后在主线程中设置一个 time.sleep
,这样当时间到了,你就可以结束这个子线程。
编辑:大概是这样的:
import threading
import urllib
def child(file_, name):
try:
image = urllib.URLopener()
image.retrieve("http://mangawriter.com/pics/pic"+str(file_)+".jpeg","pic"+str(name)+".jpeg")
print "save file %s" % file_
except IOError:
pass
file_ = 1
name = 1
for i in range(1,1000):
t = threading.Thread(target = child, args = (file_, name))
t.daemon = True
t.start()
t.join(timeout = 10)
file_ += 1
name += 1
4
我会使用 multiprocessing
模块,这个模块可以生成新的进程(不是线程),用来并行处理任务。
怎么做呢?首先,实际的下载代码应该放在一个函数里:
import urllib
import multiprocessing
import time
def download_images():
image = urllib.URLopener()
file_ = 1
name = 1
for i in range(1,1000):
try:
image.retrieve("http://mangawriter.com/pics/pic"+str(file_)+".jpeg","pic"+str(name)+".jpeg")
print "save file %s" %file_
name += 1
file_ += 1
except IOError:
file_ += 1
接下来,我们创建一个新的 multiprocessing.Process
对象,把上面的函数作为目标传进去。这个对象会启动一个进程,专门用来执行这个函数:
downloader = multiprocessing.Process(target=download_images)
一旦我们创建了进程对象,只需要调用它的 start()
方法。这会启动一个并行运行的进程:
downloader.start()
因为它是并行运行的,主程序会继续执行。现在,我们定义一个超时时间,并在这个超时时间内让程序休眠。在下面的例子中,超时时间是15秒:
timeout = 15
time.sleep(timeout)
一旦超时结束,就终止下载进程:
downloader.terminate()
完整的程序可以在 这里 找到。