Python:并行运行多个查询并获取第一个完成的结果
我想写一个Python脚本,可以同时对多个网站进行查询。这个脚本运行得不错(我用的是urllib2),但只能处理一个链接。对于多个网站,我是一个接一个地发请求,这样效率不高。
我想知道,最理想的解决方案是什么(我猜是用线程),可以让多个查询同时进行,并在某个查询返回特定字符串时停止其他查询?
我找到过一个相关的问题,但没找到如何修改它以停止剩下的线程...:Python urllib2.urlopen() 速度慢,需要更好的方法读取多个网址
提前谢谢你们!
(如果我的英语有错误,抱歉,我是法国人^^)
3 个回答
你可以使用 multiprocessing
这个库来运行你的查询,查看结果,并关闭那些你不再需要的查询。这个模块的 文档 中有关于 Process 类的信息,这个类里面有一个 terminate() 方法。如果你想限制发送的请求数量,可以看看关于池的选项。
通常,这个功能是通过以下方式实现的(抱歉,我的Python水平不太好)。
你有一个叫做Runner的类。这个类里面有一个运行很久的方法,用来获取你需要的信息。同时,它还有一个取消的方法,可以以某种方式中断这个长时间运行的方法(你可以把请求的对象作为类的一个成员变量,这样取消的方法就可以调用类似request.terminate()的功能)。
这个长时间运行的方法需要接受一个回调函数,用来在完成时发出信号。
然后,在你启动多个线程之前,你会创建这个类的所有对象的实例,并把它们放在一个列表里。在同一个循环中,你可以启动这些长时间运行的方法,并传入你主程序的回调方法。
在回调方法中,你只需要遍历所有线程类的列表,调用它们的取消方法。
请随意编辑我的回答,加入任何Python特定的实现细节 :)
你可以使用Twisted来同时处理多个请求。它内部会使用epoll(或者根据平台使用iocp或kqueue)来高效地获取TCP连接的可用性,这种方式比使用线程要省资源。当有一个请求匹配时,你可以取消其他的请求。