【问题标题】:Aiohttp: Server & Client in one timeAiohttp:一次服务器和客户端
【发布时间】:2020-04-17 06:44:17
【问题描述】:

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

1) 从服务中获取 JSON 请求 2) 快速发送 HTTP 200 OK 返回服务 3) 之后做了额外的工作:使 http-request 降低 web-service(answer 2-5 sec)

我不明白在视图(或处理程序)返回 web.Response(text="OK") 后如何执行工作?

当前视图: (这很慢导致响应前 http_request 执行缓慢) 视图.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 再启动一个线程,或者您可能知道如何向当前事件循环添加一些工作?

【问题讨论】:

    标签: python-asyncio aiohttp


    【解决方案1】:

    已经不是实际的了,因为我发现要在主 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
    

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多