多线程程序下载的文件顺序不是恒定的

Posted

技术标签:

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

我使用的程序来自: here

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

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

谢谢。

【问题讨论】:

【参考方案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)

以上是关于多线程程序下载的文件顺序不是恒定的的主要内容,如果未能解决你的问题,请参考以下文章

DELPHI下的多线程程序设计

Java多线程程序设计初步入门

POSIX 多线程程序设计

《深入浅出MFC》第十四章 多线程程序设计

多线程程序设计

[国嵌攻略][087][多线程程序设计]