将线程函数转换为asyncio

时间:2019-03-29 20:00:01

标签: python-3.x multithreading python-asyncio

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

0 个答案:

没有答案