Search code examples
pythonpython-3.xdiscord.pyschedulepython-asyncio

RuntimeError: Event loop stopped before Future completed


I am trying to set up a schedule to run a subroutine. I am trying to use the subroutine example to send a message to a discord channel when the schedule is triggered. At first I attempted to try and just send the message but got an error. I then tried looking into how to solve this and have tried different ways using asyncio all of which have not worked.

If anyone is able to give me any pointers on how I could do this then it would be much appreciated.

import discord
import asyncio
import time
import schedule # pip install schedule

client = discord.Client()
@client.event
async def on_ready():
    print("Connected!")

async def example(message):
    await client.get_channel(CHANNEL ID).send(message)

client.run(SECRET KEY)

def scheduledEvent():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(example("Test Message"))
    loop.close()

schedule.every().minute.do(scheduledEvent)

while True:
    schedule.run_pending()
    time.sleep(1)

Solution

  • You can't run your blocking schedule code in the same thread as your asynchronous event loop (your current code won't even try to schedule tasks until the bot has already disconnected). Instead, you should use the built in tasks extension which allows you to schedule tasks.

    import discord
    from discord.ext import tasks, commands
    
    CHANNEL_ID = 1234
    TOKEN = 'abc'
    
    client = discord.Client()
    
    @client.event
    async def on_ready():
        print("Connected!")
    
    @tasks.loop(minutes=1)
    async def example():
        await client.get_channel(CHANNEL_ID).send("Test Message")
    
    @example.before_loop
    async def before_example():
        await client.wait_until_ready()
    
    example.start()
    
    clinet.run(TOKEN)