Aiohttp:一次性提供服务器和客户端

时间:2020-04-14 10:58:54

标签: python-asyncio aiohttp

我尝试在服务器和客户端上同时使用aiohttp 3.6.2: 对于webhook,执行工作:

1)从服务获取JSON请求 2)快速将HTTP 200 OK发送回服务 3)之后进行了其他工作:发出http请求以减慢Web服务的速度(回答2-5秒)

我不理解在视图(或处理程序)返回web之后如何执行工作。响应(文本=“ OK”)?

当前视图: (这很慢,导致响应之前执行慢的http_request) view.py:


async def make_http_request(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            print(await resp.text())

async def work_on_request(request):
    url = (await request.json())['url']
    await make_http_request(url)
    return aiohttp.web.Response(text='all ok')

routes.py:

from views import work_on_request

def setup_routes(app):
    app.router.add_get('/', work_on_request)

server.py:

from aiohttp import web
from routes import setup_routes
import asyncio


app = web.Application()
setup_routes(app)
web.run_app(app)

所以,对我来说,解决方法是从另一个event_loop开始另一个线程,或者您知道如何在当前事件循环中添加一些工作?

1 个答案:

答案 0 :(得分:0)

已经不实际了,因为我发现决心将另一个任务添加到主event_loop中: //另外,我创建了一个全局队列以在彼此之间互操作协程。

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
queue = asyncio.Queue(maxsize=100000)

loop.create_task(worker('Worker1', queue))
app = web.Application()
app['global_queue'] = queue