Мне нужно получить некоторые цены на внешний 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)