首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问quart生命周期中的discord bot实例

无法访问quart生命周期中的discord bot实例
EN

Stack Overflow用户
提问于 2021-08-01 18:57:10
回答 1查看 57关注 0票数 0

我对事件循环感到困惑,这可能是一个常见的问题,因为人们似乎正在将discord.py与quart一起使用。我正在尝试集成discord.py、quart和celery。

我有一个看起来像这样的manage.py。它暴露了超玉米和芹菜分别使用的app和芹菜。我正在尝试让芹菜使用discord.py实例

代码语言:javascript
复制
# ./manage.py
from backend import create_app, create_celery
from backend.config import Config

app = create_app()

# celery tasks
celery = create_celery(app)

if __name__ == '__main__':
    app.run(port = 8000)

在./backend/init.py中,我定义了create_celery()和create_app()

代码语言:javascript
复制
# ./backend/__init__.py
import os
import asyncio
from quart import Quart
from backend.config import Config
from discord.ext import commands
from cogs import MainCog
from celery import Celery
import backend.celeryconfig as celeryconfig


def create_app(script_info=None):
    app = Quart(__name__)
    app.config.from_object(Config)

    # inject discord bot
    @app.before_serving
    async def before_serving(app):
        loop = asyncio.get_event_loop()
        app.discord_bot = commands.Bot(
            command_prefix=">" )
        # add cogs here
        app.discord_bot.add_cog(MainCog(app.discord_bot))

        # connect bot
        await app.discord_bot.login(Config.DISCORD_BOT_TOKEN)
        loop.create_task(app.discord_bot.connect())

    return app

def create_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_RESULT_BACKEND'],
        broker=app.config['CELERY_BROKER_URL']
    )
    celery.conf.update(app.config)
    celery.config_from_object(celeryconfig)

    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            async def helper(self, *args, **kwargs):
                async with app.app_context():
                    return await self.run(*args, **kwargs)

            loop = asyncio.get_running_loop() # <-- I'm confused about this
            coroutine = helper(self, *args, **kwargs)
            loop.run_until_complete(coroutine)

    celery.Task = ContextTask
    return celery

当我调用asyncio.get_running_loop()时,我没有得到正在运行的事件循环

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/celery/app/trace.py", line 450, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/app/backend/__init__.py", line 59, in __call__
    loop = asyncio.get_running_loop()
RuntimeError: no running event loop

如何从celery的上下文访问app.discord_bot?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-01 19:09:56

这并不能完全解决这个错误,但另一种方法是使用discord-ext-ipc在discord.py和quart之间进行ipc通信。在这种方法中,增加ASGI服务器中的工作进程数将增加不一致机器人实例的数量,从而导致不一致服务器上的重复响应。

https://github.com/Ext-Creators/discord-ext-ipc

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68613479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档