如何在任意超时后停止Python程序

时间:2011-12-15 01:34:51

标签: 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 :(得分: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"