通过多线程进程运行时保持字典完整性

时间:2016-09-07 20:21:21

标签: python multithreading dictionary

我通过使用多线程函数来加速进程,但是我需要保持输出和输入之间的关系。

import requests
import pprint
import threading

ticker = ['aapl', 'googl', 'nvda']
url_array = []

for i in ticker:
    url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + i + '?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com'
    url_array.append(url)


def fetch_ev(url):
    urlHandler = requests.get(url)
    data = urlHandler.json()
    ev_single = data['quoteSummary']['result'][0]['defaultKeyStatistics']['enterpriseValue']['raw']
    ev_array.append(ev_single)  # makes array of enterprise values

threads = [threading.Thread(target=fetch_ev, args=(url,)) for url in
           url_array]  # calls multi thread that pulls enterprise value


for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

pprint.pprint(dict(zip(ticker, ev_array)))

代码的示例输出:

1){'aapl': '30.34B', 'googl': '484.66B', 'nvda': '602.66B'}

2){'aapl': '484.66B', 'googl': '30.34B', 'nvda': '602.66B'}

我需要将值与正确的股票代码匹配。

编辑:我知道字典不会保留顺序。对不起,也许我的问题有点(非常)不清楚。我有一系列的股票代码符号,与我的网址输入的顺序相匹配。运行fetch_ev后,我想将这些股票代码符号与匹配的企业价值或ev_single结合起来。它们存储的顺序无关紧要,但是配对( k v 对)或哪些值与非常一起存储重要。

Edit2(MCVE)我将代码更改为我所拥有的更简单的版本 - 更好地显示了问题。对不起,它比我想要复杂的要复杂一点。

1 个答案:

答案 0 :(得分:1)

为了便于维护输入和输出之间的对应关系,可以预先分配With Sheets("Sheet 1") .Select .ListObjects("Table1").ListRows.Add AlwaysInsert:=True End With Range("BA10").Select ,使其与ev_array数组的大小相同,并ticker thread函数可以给出一个额外的参数,指定该数组中用于存储所获取值的位置的索引。

维护fetch_ev()的完整性,添加了ev_array以防止对共享资源的并发访问,否则可能由多个线程同时写入。 (由于其内容现在直接通过传递给threading.RLock的索引引用,因此这可能不是绝对必要的。)

我不知道正确的股票代码↔企业价值并发,以便能够验证这样做的结果:

fetch_ev()

但至少每次运行时它们都是相同的。

{'aapl': 602658308096L, 'googl': 484659986432L, 'nvda': 30338199552L}