【问题标题】:Python : run multiple queries in parallel and get the first finishedPython:并行运行多个查询并完成第一个
【发布时间】:2011-07-01 14:54:32
【问题描述】:

我尝试创建一个对多个站点执行查询的 Python 脚本。该脚本运行良好(我使用 urllib2),但仅用于一个链接。对于多个站点,我一个接一个地发出多个请求,但它不是很强大。

什么是并行运行多个查询并在查询返回特定字符串时停止其他查询的理想解决方案(我猜是线程)?

我发现了这个问题,但我还没有找到如何更改它以停止剩余线程...: Python urllib2.urlopen() is slow, need a better way to read several urls

提前谢谢你!

(对不起,如果我在英语中有错误,我是法国人^^)

【问题讨论】:

    标签: python multithreading urllib2


    【解决方案1】:

    您可以使用 Twisted 同时处理多个请求。在内部,它将使用 epoll(或 iocp 或 kqueue,取决于平台)来有效地获得 tcp 可用性的通知,这比使用线程便宜。一旦一个请求匹配,你cancel其他请求。

    Here is the Twisted http agent tutorial.

    【讨论】:

      【解决方案2】:

      通常这是通过以下模式实现的(抱歉,我的 Python 技能不太好)。

      你有一个名为 Runner 的类。此类具有长时间运行的方法,可以获取您需要的信息。另外,它还有一个Cancel方法,它会以某种方式中断长时间运行的方法(可以将url请求对象设为类成员字段,所以cancel类调用request.terminate()的等价物)。

      长时间运行的方法需要接受一个回调函数,完成后发出信号。

      然后,在启动多个线程之前,创建该类的所有这些对象的实例,并将它们保存在一个列表中。在同一个循环中,您可以启动这些长时间运行的方法,传递主程序的回调方法。

      而且,在回调方法中,您只需遍历所有线程类的列表并调用它们的取消方法。

      请用任何 Python 特定实现编辑我的答案:)

      【讨论】:

        【解决方案3】:

        您可以使用multiprocessing 库运行查询、轮询结果以及关闭不再需要的查询。模块的Documentation 包含有关Process 类的信息,该类具有terminate() 方法。如果您希望限制发出的请求数量,请查看池选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-17
          • 1970-01-01
          • 1970-01-01
          • 2020-12-17
          • 1970-01-01
          • 2014-05-20
          • 1970-01-01
          • 2016-04-04
          相关资源
          最近更新 更多