Python Jobqueue多消息传递问题

问题描述 投票:0回答:1

当用户在程序中快速移动并快速进入函数时,Jobqueue 发送相同的消息 2 次,即使 user_last_len 值相同,但是当用户行为缓慢并正常进入函数时,它应该发送 1,我尝试调试程序并理解它为什么这样做,但我在调试时没有遇到任何问题,并且它发送了 1 次消息。

user_last_len = {}

async def first(update: Update, context: CallbackContext):

    async def check(context: CallbackContext):

        await asyncio.sleep(2)

        try:
            conn = connection_pool.get_connection()
            cursor = conn.cursor()

            user_id = update.message.from_user.id
            cursor.execute("SELECT LikeID FROM Likes WHERE LikedID = %s", (user_id,))
            likes = cursor.fetchall()

            len_likes = len(likes)
            last_len = user_last_len.get(user_id, 0)

            if len_likes > 0 and last_len != len_likes:
                await update.message.reply_text(f"{len_likes}", reply_markup=show_markup)
                user_last_len[user_id] = len_likes
                context.job.data = True

            cursor.close()
            conn.close()

        except Exception as e:
            pass
            
        finally:
            await asyncio.sleep(1)

    job = context.job_queue.run_repeating(check, interval=300, first=0, data=None, name="dgc")
    await job.run(context.application)
python telegram-bot python-telegram-bot job-queue
1个回答
0
投票

解决问题的方法是在发送消息之前让user_last_len[user_id] = len_likes,因为我意识到当它发送消息时,它会回到try块的开头,再次进入if块,所以它无法正确检查last_len != len_likes,因为它在执行 user_last_len[user_id] = len_likes 之前返回到 try 块的开头。

user_last_len = {}

async def first(update: Update, context: CallbackContext):

    async def check(context: CallbackContext):

        await asyncio.sleep(2)

        try:
            conn = connection_pool.get_connection()
            cursor = conn.cursor()

            user_id = update.message.from_user.id
            cursor.execute("SELECT LikeID FROM Likes WHERE LikedID = %s", (user_id,))
            likes = cursor.fetchall()

            len_likes = len(likes)
            last_len = user_last_len.get(user_id, 0)

            if len_likes > 0 and > last_len != len_likes:
                user_last_len[user_id] = len_likes

                await update.message.reply_text(f"{len_likes}", reply_markup=show_markup)
                
                context.job.data = True

            cursor.close()
            conn.close()

        except Exception as e:
            pass
            
        finally:
            await asyncio.sleep(1)

    job = context.job_queue.run_repeating(check, interval=300, first=0, data=None, name="dgc")
    await job.run(context.application)
© www.soinside.com 2019 - 2024. All rights reserved.