如何解决基于Flask的Slack应用异步消息重复发送问题
问题根源
Flask 开启debug模式时会默认启动重载器(reloader),用来监听代码变更自动重启服务,此时会创建两个进程:
- 一个是重载器监听进程
- 一个是实际运行Flask服务的工作进程
你写在全局作用域(if __name__ == "__main__"判断外部)的初始化代码会在两个进程中各执行一次,所以会出现两次异步消息发送。而斜杠命令的回调逻辑只有工作进程会接收Slack请求触发,所以不会重复发送。
解决方案
方案1:关闭Flask重载器
如果不需要代码变更自动重启的功能,直接在启动服务时加use_reloader=False参数即可:
if __name__ == "__main__": port = int(os.environ.get('PORT', 5000)) bot.run(host='0.0.0.0', port=port, debug=True, use_reloader=False)
方案2:将初始化逻辑移入主进程判断块
把全局执行的异步消息发送、守护线程启动逻辑挪到if __name__ == "__main__"内部,这样只有主工作进程会执行这部分代码,重载进程不会触发:
if __name__ == "__main__": # 把原本全局的初始化代码移到这里 slack_handle.sendTreasurer("Restarting Money Bot") td = threading.Thread(target = drive_access.mainDaemon) td.daemon = True td.start() port = int(os.environ.get('PORT', 5000)) bot.run(host='0.0.0.0', port=port, debug=True)
内容的提问来源于stack exchange,提问作者Dawson Moore
相关产品推荐
相关产品推荐

