如何在Python中设置任意超时停止程序

1 投票
3 回答
2613 浏览
提问于 2025-04-17 08:24

举个例子,这段代码是可以正常运行的

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()

完整的程序可以在 这里 找到。

撰写回答