Выполнение Asyn c или параллельных запросов с Django 3.0.1 - PullRequest
0 голосов
/ 07 января 2020

У меня простой способ подключения к API для ряда акций и сохранения их в базе данных:

def update (request):
    if request.method == 'GET':
        localStocks = Stock.objects.all()
        output = []
        ticker = []
        for local_stock in localStocks:
            api_response = requests.get("https://cloud.iexapis.com/stable/stock/"+ str(local_stock.ticker) + "/quote/?token="+token)
            ticker.append(local_stock.ticker)
            try:
                data = json.loads(api_response.content)

                output.append (data)
                dic_data = {
                    "symbol": data['symbol'] , 
                    "latestPrice": data['latestPrice'] , 
                    "companyName":  data['companyName'], 
                    "week52High": data['week52High'] , 
                    "week52Low": data['week52Low'] , 
                    "ytdChange": data['ytdChange'] ,
                    "latestTime":  data['latestTime'],  
                    "changePercent": data['changePercent'] , 
                }

                for i in dic_data:
                    setattr(local_stock, i, dic_data[i])
                    print (dic_data[i])
                local_stock.save()

            except Exception as e:
                    api = "%%% DB save Error %%%"
                    print(e)    


    return redirect ("stocks:get_stock")

Проблема в том, что даже с 12 акциями этот код работает очень медленно , Я прочитал учебное пособие на здесь , но я не уверен, стоит ли мне пытаться использовать параллельные запросы или асин c запросы в моем коде и как это реализовать.

1 Ответ

0 голосов
/ 07 января 2020

Как я понимаю, все, что вы хотите здесь сделать, это получить последние значения запасов и обновить эти данные в вашей базе данных. Здесь ваш код сильно зависит от времени ответа на запрос iexapis. Я бы посоветовал вам либо получить данные в пакете, либо переместить весь ваш код в другой поток, где вы сначала получите значение запаса, а затем обновите его в своей базе данных, но в потоке.

Что-то вроде этого. .....

def method1:
    some_list=[1,2,3,4]
    for a in some_list:
        t = threading.Thread(target=func, args=(a,))
        t.start()
    return True

def func_up():
    #fetch data from api and update in database
    return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...