我对事件循环感到困惑,这可能是一个常见的问题,因为人们似乎正在将discord.py与quart一起使用。我正在尝试集成discord.py、quart和celery。
我有一个看起来像这样的manage.py。它暴露了超玉米和芹菜分别使用的app和芹菜。我正在尝试让芹菜使用discord.py实例
# ./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()
# ./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()时,我没有得到正在运行的事件循环
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?
发布于 2021-08-01 19:09:56
这并不能完全解决这个错误,但另一种方法是使用discord-ext-ipc在discord.py和quart之间进行ipc通信。在这种方法中,增加ASGI服务器中的工作进程数将增加不一致机器人实例的数量,从而导致不一致服务器上的重复响应。
https://stackoverflow.com/questions/68613479
复制相似问题