Преобразовать функцию потока в asyncio - PullRequest
0 голосов
/ 29 марта 2019

Мне нужно получить некоторые цены на внешний API, один за другим для дюжины объектов, и это примерно 2 или 3 секунды для каждого запроса, поэтому он может стать довольно длинным.

Я (вроде) знал, как сделать многопоточность в Python, я реализовал его, и он отлично работает, и он довольно быстрый.

Тогда я недавно обнаружил asyncio, и кажется, что он мог бы быть полезен в моей ситуации вместо открытия нескольких потоков.Поэтому я попытался «преобразовать» свой многопоточный код в код, используя asyncio, как вы можете видеть ниже, после прочтения некоторых примеров.Но когда testOne не работает и ошибка Task exception was never retrieved.Я очистил код для лучшего понимания (дайте мне знать, если вам нужна дополнительная информация).

from threading import Thread
import asyncio


### ASYNC MULTI THREAD ####
def prixMulti(client, symbol, prix):                                                                           
    prix[symbol] = # API price request using client

def testMulti(client, sql):
    prix = {}
    objects = # Database request using sql
    listeThread = []
    for object in objects:
        listeThread.append(Thread(target=prixMulti, args=(client, object['name'], prix)))
    for t in listeThread:
        t.start()    
    for t in listeThread:
        t.join()
    print(prix)

#### ASYNC ONE THREAD ####
async def prixOne(client, symbol):
    return #same API price request using client

async def prixOneWait(client, symbol, prix):
    prix[symbol] = await prixOne(client, symbol)

def testOne(client, sql):
    prix = {}
    objects = # Database request using sql
    tasks = []
    loop = asyncio.get_event_loop()
    for object in objects: 
        tasks.append(loop.create_task(prixOneWait(client, prix, object['nom'] )))
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()
    print(prix)

# Some code to initialise client and sql 

testMulti(client, sql)
testOne(client, sql)
...