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

python-telegram-bot使用multiprocessing实现并行任务失效问题求助

问题原因分析
  • target参数使用错误:multiprocessing.Process的target参数只接受函数引用,你写的target=remember(update, context)会在创建进程对象时,立刻在当前主进程同步执行remember函数,根本不会把函数传给子进程运行。如果remember内部是死循环的定时查询逻辑,后续创建p2、启动进程的代码永远不会被执行,这是你看不到主菜单逻辑运行的核心原因。
  • 参数序列化不支持:python-telegram-bot的Update和CallbackContext对象不可序列化,multiprocessing创建子进程时需要序列化所有传入的参数,哪怕你改对了target的写法,直接传这两个对象也会导致进程启动报错。
  • 存在进程泄漏风险:你当前的写法每次用户触发请求都会新建两个进程,没有回收逻辑,长时间运行会导致系统资源被占满。
解决方案

方案1:修复现有多进程逻辑

如果要继续使用自定义多进程实现,需要调整参数传递逻辑,避免直接传不可序列化的对象:

from multiprocessing import Process
from telegram import Bot
import os

BOT_TOKEN = os.getenv("YOUR_BOT_TOKEN")

def remember_process_starter(update: Update, context: CallbackContext):
    # 提前抽取可序列化的必要参数,不要直接传update/context
    chat_id = update.effective_chat.id
    query_content = update.message.text
    # target仅传函数名,参数通过args元组传递
    p1 = Process(target=remember, args=(chat_id, query_content))
    p1.daemon = True # 设为守护进程,主进程退出时自动杀死子进程
    p1.start()
    # 主菜单逻辑不需要开子进程,直接在当前进程调用即可
    main_menu(update, context)

def remember(chat_id: int, query_content: str):
    # 单独初始化Bot对象,不要依赖原来的context
    bot = Bot(token=BOT_TOKEN)
    # 调用价格查询逻辑
    price_result = Alert.alert(query_content)
    # 主动发消息返回结果
    bot.send_message(chat_id=chat_id, text=price_result)

方案2:使用框架原生JobQueue(更推荐)

python-telegram-bot自带定时任务调度组件JobQueue,不需要自己维护多进程,完美适配框架逻辑,也不会有参数序列化、进程泄漏的问题:

# 注册定时任务命令
def start_alert(update: Update, context: CallbackContext):
    # 解析用户输入的查询间隔、币种,示例输入:/start_alert BTC 300
    coin = context.args[0]
    interval = int(context.args[1])
    chat_id = update.effective_chat.id
    # 添加重复执行的定时任务
    context.job_queue.run_repeating(
        callback=push_price,
        interval=interval,
        chat_id=chat_id,
        data={"coin": coin}
    )
    update.message.reply_text(f"已开启{coin}价格提醒,每{interval}秒推送一次")

# 定时任务回调,自动执行查询发消息
def push_price(context: CallbackContext):
    job = context.job
    coin = job.data["coin"]
    price = Alert.alert(coin)
    context.bot.send_message(job.chat_id, text=f"{coin}当前价格:{price}")

# 绑定命令处理器
application.add_handler(CommandHandler("start_alert", start_alert))

使用该方案不需要修改原有主程序逻辑,机器人可以同时正常响应其他查询请求。

内容的提问来源于stack exchange,提问作者iLucasRT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:54:01