【问题标题】:Order of files downloaded by a multithreaded program is not constant多线程程序下载的文件顺序不是恒定的
【发布时间】:2011-02-20 21:34:25
【问题描述】:

我使用的程序来自: here

一次下载多个网址。它工作正常,但是接收到的队列中 url 的顺序与它们在 urls 列表中的顺序不同,而且它也不是恒定的(从运行到运行的变化)。

我该怎么做才能使它们的顺序保持不变或知道哪个 url 属于接收到的队列中的哪个索引。

谢谢。

【问题讨论】:

    标签: python multithreading urllib2


    【解决方案1】:

    fetch改成这样:

    def fetch(url):
        return (url, urllib2.urlopen(url).read())
    

    你得到一个充满元组的队列,而不是一个充满字符串的队列,每个字符串都包含一个结果。

    您将无法取回一个队列,其中的事物总是相同的顺序,因为多线程对于这样的事情不是确定性的。所以最好的办法是确保每个东西都被标记,以便您以后识别它。

    【讨论】:

      【解决方案2】:

      您可以将索引号添加到 URL...

      urls = [
          (0, 'http://www.google.com/'),
          (1, 'http://www.lycos.com/'),
          (2, 'http://www.bing.com/'),
          (3, 'http://www.altavista.com/'),
          (4, 'http://achewood.com/'),
      ]
      
      def fetch(index, url):
          data = urllib2.urlopen(url).read()
          # ... do whatever you need using index ...
      

      【讨论】:

      • 您能详细说明一下吗?我不明白这有什么帮助。网址已编入索引。你可以做 urls.index(google.com).... 谢谢
      • 如果您需要在接收到特定 URL 后进行一些其他多线程处理,那么在 fetch 函数中使用索引可能会有所帮助。如果您只需要知道哪些数据来自哪个 url,那么您可以按照 Omnifarious 的建议让 fetch 返回(url, data)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多