我需要获得一个外部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)