当用户在程序中快速移动并快速进入函数时,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)
解决问题的方法是在发送消息之前让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)