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']
- 是不是因为下载进度导致线程加入早晚?
- 如何 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
我正在使用 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']
- 是不是因为下载进度导致线程加入早晚?
- 如何 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