在pythonrq中执行等待/异步函数

在pythonrq中执行等待/异步函数,python,async-await,python-rq,Python,Async Await,Python Rq,我的作业都是一系列的请求,每个对象都需要执行这些请求。也就是说,它是一个用户,有几个数据点(可能有数百个)需要通过请求添加到该用户。我最初编写了同步运行的请求,但它阻塞且速度缓慢。我将每个用户作业发送到pythonrq,并让10名工人检查发送到队列中的用户。1个工人,1个用户,阻止请求 我重新编写了我的用户作业,使用aiohttp而不是python请求,而且速度要快得多。在pythonrq文档中,它说‘任何Python函数调用都可以放在RQ队列上’,但我不知道如何将异步函数发送到队列中 asy

我的作业都是一系列的请求,每个对象都需要执行这些请求。也就是说,它是一个
用户
,有几个数据点(可能有数百个)需要通过请求添加到该用户。我最初编写了同步运行的请求,但它阻塞且速度缓慢。我将每个
用户
作业发送到pythonrq,并让10名工人检查发送到队列中的用户。1个工人,1个用户,阻止请求

我重新编写了我的用户作业,使用aiohttp而不是python请求,而且速度要快得多。在pythonrq文档中,它说‘任何Python函数调用都可以放在RQ队列上’,但我不知道如何将异步函数发送到队列中


async def get_prices(calls: List[dict]) -> List[dict]:
     async with aiohttp.ClientSession() as session:
         for price in prices.items():
                price_type, date = price
                price = await pg.get_price(
                    session=session, lookup_date=date
                )
        do_some_other_stuff()
        await session.close()


问题是,人们从来没有等待过
获取价格
,它只是一个合作项目。。。。如何在队列上等待我的函数?

由于
python rq
不直接支持异步IO,因此可以使用调用
异步IO.run
的同步函数


async def get_prices(calls: List[dict]) -> List[dict]:
     async with aiohttp.ClientSession() as session:
         for price in prices.items():
                price_type, date = price
                price = await pg.get_price(
                    session=session, lookup_date=date
                )
        do_some_other_stuff()
        await session.close()

async def\u get\u prices(调用:List[dict])->List[dict]:
# ...
def get_价格(*args,**kwargs):
asyncio.run(_get_prices(*args,**kwargs))
但是,请注意,
asyncio.run
仅在没有其他正在运行的事件循环时才起作用。如果您希望asyncio循环已经在运行,请使用
loop.create\u task

def get_prices(*args,**kwargs):
loop=asyncio.get\u event\u loop()
coro=_get_prices(*args,**kwargs)
循环创建任务(coro)
然后,当
pythonrq
调用
get\u prices
时,它将导致执行异步函数

另一种选择是不使用asyncio进行请求,比如使用
grequests
、线程,或者类似于使用同步函数的方法