多线程程序下载的文件顺序不是恒定的
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)
。以上是关于多线程程序下载的文件顺序不是恒定的的主要内容,如果未能解决你的问题,请参考以下文章