例如,此代码正在运行
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
即使代码仍在运行,我怎么能在花费一些时间后停止它?请帮我解决一下。
答案 0 :(得分: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()
可以找到完整的程序here。
答案 1 :(得分: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
答案 2 :(得分: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"