gpt4 book ai didi

python - 多个 aiohttp Application() 在同一个进程中运行?

转载 作者:太空狗 更新时间:2023-10-29 17:31:02 24 4
gpt4 key购买 nike

两个 aiohttp.web.Application() 对象可以在同一个进程中运行吗?在不同的端口?

我看到了一堆 aiohttp 代码示例,例如:

from aiohttp import web
app = web.Application()
app.router.add_get('/foo', foo_view, name='foo')
web.run_app(app, host='0.0.0.0', port=10000)

我想知道是否有一些等效项可以将多个 web.Applications() 配置为同时运行。像这样的东西:

from aiohttp import web
app1 = web.Application()
app1.router.add_get('/foo', foo_view, name='foo')
app2 = web.Application()
app2.router.add_get('/bar', bar_view, name='bar')
# This is the wishful thinking code:
web.configure_app(app1, host='0.0.0.0', port=10000)
web.configure_app(app2, host='0.0.0.0', port=10001)
web.run_apps()

我的用例是我有一个现有的 python web 框架来做这种事情,我正在构建一个类似于 python 3.6 中的 aiohttp 的原型(prototype)。

我知道多个 python 服务器可以在后面运行,例如nginx(另见 http://aiohttp.readthedocs.io/en/stable/deployment.html );那不是我想要的。我想探索两个具有相同 asyncio 事件循环的 aiohttp 网络服务器的可能性,它们在相同的 python 进程中运行,在两个不同的端口上提供服务。

最佳答案

是的,你可以 - 只需编写一些包装器重新实现 run_app .

这是一个简单的例子。 run_app 的所有特定于应用程序的部分都移至专用类 AppWrapperMultiApp 只负责初始化所有已配置的应用程序,继续运行循环并进行清理。

import asyncio
from aiohttp import web


class AppWrapper:

def __init__(self, aioapp, port, loop):
self.port = port
self.aioapp = aioapp
self.loop = loop
self.uris = []
self.servers = []

def initialize(self):
self.loop.run_until_complete(self.aioapp.startup())
handler = self.aioapp.make_handler(loop=self.loop)

server_creations, self.uris = web._make_server_creators(
handler, loop=self.loop, ssl_context=None,
host=None, port=self.port, path=None, sock=None,
backlog=128)

self.servers = self.loop.run_until_complete(
asyncio.gather(*server_creations, loop=self.loop)
)

def shutdown(self):
server_closures = []
for srv in self.servers:
srv.close()
server_closures.append(srv.wait_closed())
self.loop.run_until_complete(
asyncio.gather(*server_closures, loop=self.loop))

self.loop.run_until_complete(self.aioapp.shutdown())

def cleanup(self):
self.loop.run_until_complete(self.aioapp.cleanup())

def show_info(self):
print("======== Running on {} ========\n".format(', '.join(self.uris)))


class MultiApp:

def __init__(self, loop=None):
self._apps = []
self.user_supplied_loop = loop is not None
if loop is None:
self.loop = asyncio.get_event_loop()
else:
self.loop = loop

def configure_app(self, app, port):
app._set_loop(self.loop)
self._apps.append(
AppWrapper(app, port, self.loop)
)

def run_all(self):
try:
for app in self._apps:
app.initialize()
try:
for app in self._apps:
app.show_info()
print("(Press CTRL+C to quit)")
self.loop.run_forever()
except KeyboardInterrupt: # pragma: no cover
pass
finally:
for app in self._apps:
app.shutdown()
finally:
for app in self._apps:
app.cleanup()

if not self.user_supplied_loop:
self.loop.close()

注意:注意内部aiohttp方法的使用,它可能会发生变化。

现在让我们使用它:

from aiohttp import web

async def handle1(request):
return web.Response(text='SERVER 1')


async def handle2(request):
return web.Response(text='SERVER 2')

app1 = web.Application()
app1.router.add_get('/', handle1)

app2 = web.Application()
app2.router.add_get('/', handle2)

ma = MultiApp()
ma.configure_app(app1, port=8081)
ma.configure_app(app2, port=8071)
ma.run_all()

作为旁注,再想一想你为什么需要这个。在几乎所有情况下,去耦都是更好的选择。在同一进程中设置多个端点会使它们相互依赖。我想到了一个案例,它具有“良好”的推理,即内部统计/调试端点。

关于python - 多个 aiohttp Application() 在同一个进程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com