带有多线程的Python脚本显示了与传递的列表序列不同的错误序列



我使用fetch_parallel方法下载fits文件,并希望它们按顺序排列,这样我就可以使用matplotlib绘制它们,但每次运行脚本时都会有一个单独的返回对象序列,这意味着如果我通过

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. 如何按与passsed相同的顺序返回
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)

尝试这些更改,结果应该是"共享的";在urls 中以与url相同的顺序列出并写入结果

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

最新更新