You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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任务。我们可以通过线程安全的任务队列实现串行逻辑:

  1. 创建全局队列存储待处理的消息
  2. 修改消息处理函数,仅将消息加入队列,不直接执行bat脚本
  3. 启动单独的后台线程,持续从队列中取出任务,逐个执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:30:53