正如Alex Martelli建议的那样,您可以使用多处理模块。它与线程模块非常相似,所以应该让你轻松入门。你的代码可能是这样的,例如:
import multiprocessing
def get_page(*args, **kwargs):
# your web page downloading code goes here
def start_get_page(timeout, *args, **kwargs):
p = multiprocessing.Process(target=get_page, args=args, kwargs=kwargs)
p.start()
p.join(timeout)
if p.is_alive():
# stop the downloading 'thread'
p.terminate()
# and then do any post-error processing here
if __name__ == "__main__":
start_get_page(timeout, *args, **kwargs)
当然,你需要以某种方式获得您的主页下载代码的返回值。为此,您可以使用multiprocessing.Pipe或multiprocessing.Queue(或其他可用于多处理的方法)。有更多的信息,以及您可以在http://docs.python.org/library/multiprocessing.html检查的样本。
最后,多处理模块包含在python 2.6中。它也可用于在Python 2.5和2.4在PyPI中(可以使用
easy_install的多处理
)
或只需访问的PyPI和手动下载并安装软件包。
注意:我意识到这已经发布了一段时间。我遇到了类似的问题,在这里偶然发现了Alex Martelli的建议。如果它执行我的问题,并决定分享它。 (我想感谢Alex指着我朝着正确的方向。)
问题是,当你有一个方法需要很长时间(例如urllib.read(),在某些情况下它会忽略超时),你我想打断。 – kolinko 2013-09-12 15:08:09
如果你在自己的线程上执行该读取,你不能简单地停止等待它吗?最终它会完成/失败/完成,然后它就死了? – 2013-09-13 06:05:07