Python 多线程脚本显示与传递的列表序列不同的序列

Python script with multi-threading showing wrong sequence from that of the sequence of list passed

我正在使用 fetch_parallel 方法下载适合的文件并希望它们按顺序排列,以便我可以使用 matplotlib 绘制它们,但每次我 运行 脚本都有一个单独的序列returned 对象意味着如果我通过

urls=['foo1','foo2','foo3']

# the return sequence should be:
return_objects = ['obj1','obj2','obj3']

# but i am getting random sequence like:
return_objects = ['obj3','obj1','obj2']
  1. 是不是因为下载进度导致线程加入早晚?
  2. 如何 return 与通过的顺序相同?
def fetch_parallel(urls):
  result = queue.Queue()
  threads = [threading.Thread(target=read_url, args = (url,result)) for url in urls]
  for t in threads:
      t.start()
  for t in threads:
      t.join()
  return result

更新:read_url 方法


def read_url(url, queue):
  data = urllib.request.urlopen(url, timeout=300)
  fget = fts.getdata(data, header=True)
  print('Fetched %s from %s' % (len(fget), url))

  queue.put(fget)

试试这个更改,结果应该是一个“共享”列表,并按照与 url 相同的顺序写入 urls

result = list(xrange(len(urls)))
threads = [threading.Thread(target=read_url, args = (urls[i_url], i_url, result)) for i_url in xrange(len(urls))]


def read_url(url, i_url, queue):
    ...

    #queue.put(fget)
    queue[i_url] = fget