Telegram机器人监听数据库新记录功能异常求助
问题分析与修复方案
核心问题拆解
- 多进程全局变量不共享:multiprocessing子进程会复制父进程变量空间,
main2_func中修改的PROCESS和主进程的PROCESS完全独立,导致主进程的while PROCESS:循环永远无法终止,机器人进程也不会被暂停。 - 进程启动逻辑错误:
main2_func中尝试调用p1.start(),但p1是主进程创建的Process对象,子进程无法直接访问;且一个进程对象仅能调用一次start(),重复调用会直接报错。 - 进程控制混乱:
main1_func用subprocess.Popen启动main.py,同时又通过multiprocessing启动main1_func,形成两层嵌套进程,后续无法通过p1.terminate()正确终止Telegram机器人进程。 - 输出缓冲延迟:Python默认输出缓冲机制可能导致
print('ok')内容无法即时显示,造成“仅输出一次”的错觉。
修复后的代码示例
使用multiprocessing的Event实现可靠的进程间通信,替代全局变量控制机器人的暂停与恢复:
import datetime as dt import time as t import main as m import database as dat import multiprocessing as mp def telegram_bot(stop_event): # 直接调用机器人启动逻辑,避免subprocess嵌套 m.run_bot(stop_event) def database_monitor(stop_event): while True: print('ok') d = dat.data() current_time = int(dt.datetime.now().strftime('%y%m%d%H%M')) new_records = d.perev(current_time) if new_records != []: # 触发停止信号,暂停机器人 stop_event.set() # 执行指定处理函数 m.perevirka_1() t.sleep(2) # 清除停止信号,恢复机器人运行 stop_event.clear() t.sleep(600) if __name__ == '__main__': # 用Event实现进程间状态同步 stop_bot_event = mp.Event() # 创建并启动进程 bot_process = mp.Process(target=telegram_bot, args=(stop_bot_event,)) monitor_process = mp.Process(target=database_monitor, args=(stop_bot_event,)) monitor_process.start() bot_process.start() # 保持主进程存活,等待子进程结束 bot_process.join() monitor_process.join()
配套调整说明
需要修改main.py中的机器人逻辑,让它支持监听停止信号:
# main.py中的机器人启动函数示例 def run_bot(stop_event): # 初始化你的Telegram机器人实例 bot = ... while True: # 检查是否需要暂停 if stop_event.is_set(): t.sleep(1) continue # 正常处理消息逻辑 bot.polling(timeout=10)
内容的提问来源于stack exchange,提问作者Максим Гера
相关产品推荐
相关产品推荐

