我尝试创建一个Python脚本,对多个站点执行查询。该脚本运行良好(我使用urllib2),但只是一个链接。对于多个站点,我一个接一个地发出多个请求,但它不是很强大。
什么是理想的解决方案(我猜的是线程)并行运行多个查询并在查询返回特定字符串时停止其他查询?
我发现了这个问题,但我还没有找到如何更改它以停止剩余的线程......: Python urllib2.urlopen() is slow, need a better way to read several urls
提前谢谢!
(对不起,如果我用英语犯了错误,我就是法语^^)
答案 0 :(得分:2)
您可以使用Twisted同时处理多个请求。在内部,它将使用epoll(或iocp或kqueue,具体取决于平台)来获得有效的tcp可用性通知,这比使用线程便宜。一个请求匹配后,您cancel其他请求。
答案 1 :(得分:0)
通常使用以下模式实现(抱歉,我的Python技能不太好)。
你有一个名为Runner的类。该类具有长时间运行的方法,可以获取所需的信息。此外,它有一个Cancel方法,它以某种方式中断长时间运行的方法(你可以使url请求对象成为一个类成员字段,因此cancel类调用相当于request.terminate())。
长时间运行的方法需要接受一个回调函数,该函数在完成时发出信号。
然后,在启动多个线程之前,您将创建该类的所有这些对象的实例,并将它们保存在列表中。在同一个循环中,您可以启动这些长时间运行的方法,传递主程序的回调方法。
而且,在回调方法中,你只需要通过所有线程类的列表并调用它们的cancel方法。
请使用任何Python特定实现编辑我的答案:)
答案 2 :(得分:0)
您可以使用multiprocessing
库运行查询,轮询结果并关闭不再需要的查询。该模块的Documentation包含Process类的信息,该类具有terminate()方法。如果您希望限制发出的请求数,请查看池的选项。