Python TeleBot单消息串行处理:实现bat下载任务逐一执行
实现TeleBot消息串行处理:单任务完成后再执行下一个下载任务
问题背景
你当前使用TeleBot接收Telegram中的下载链接,通过调用fullrun.bat脚本执行下载,每个任务耗时约15分钟。但现有代码会同时触发多个并行任务,需要改为串行处理——完成一个bat任务后再处理下一条消息。
现有代码:
def handle_text_doc(message): print ("bot new link to download") with open ("test.txt","r") as arquivo: email = arquivo.read() #print (email) with open ("test.txt","w") as arquivo: texto = str(message) arquivo.write(texto) with open ("test.txt","r") as arquivo: email = arquivo.read() subprocess.call([r'c:\downloads\fullrun.bat']) print ("terminado")
解决方案:使用任务队列实现串行处理
TeleBot默认采用多线程处理消息,导致多条消息会同时触发handle_text_doc函数,进而并行执行bat任务。我们可以通过线程安全的任务队列实现串行逻辑:
- 创建全局队列存储待处理的消息
- 修改消息处理函数,仅将消息加入队列,不直接执行bat脚本
- 启动单独的后台线程,持续从队列中取出任务,逐个执行bat(利用
subprocess.call的阻塞特性,确保当前任务完成后再处理下一个)
修改后的代码
import telebot import subprocess import queue import threading # 创建线程安全的任务队列 task_queue = queue.Queue() def process_tasks(): """后台线程:串行处理队列中的下载任务""" while True: message = task_queue.get() # 阻塞等待新任务 try: print("开始处理新下载任务") # 将当前消息内容写入test.txt(与原有逻辑一致) with open("test.txt", "w") as arquivo: texto = str(message) arquivo.write(texto) # 执行bat脚本,阻塞直到任务完成 subprocess.call([r'c:\downloads\fullrun.bat']) print("当前下载任务已完成") finally: task_queue.task_done() # 标记当前任务处理完成 def handle_text_doc(message): """消息处理函数:仅将消息加入任务队列""" print("收到新下载链接,加入任务队列") task_queue.put(message) # 初始化TeleBot(替换为你的bot token) bot = telebot.TeleBot("YOUR_BOT_TOKEN") bot.register_message_handler(handle_text_doc, content_types=['text']) # 启动后台任务处理线程(设为守护线程,主程序退出时自动终止) threading.Thread(target=process_tasks, daemon=True).start() # 启动bot消息轮询 bot.polling()
关键说明
queue.Queue是Python标准库提供的线程安全队列,确保多线程环境下任务不会出现混乱process_tasks作为后台守护线程,会持续循环从队列获取任务,task_queue.get()会阻塞直到有新任务进入队列subprocess.call是阻塞式调用,只有当bat脚本完全执行完毕后,才会继续处理队列中的下一个任务- 原有的文件读写逻辑被整合到任务处理线程中,确保每个任务对应的消息内容准确无误
内容的提问来源于stack exchange,提问作者Renan RR
相关产品推荐
相关产品推荐

