如何在Visual Studio Code中同时运行两个含无限循环的Python脚本?
解决两个无限循环Python脚本同时运行的问题
看起来你遇到的核心问题是两个阻塞的无限循环逻辑抢占了主线程——要么爬虫先跑起来卡死了Dash的启动,要么Dash的run_server先启动后,爬虫代码根本没机会执行。用threading是正确的思路,但得调整代码结构,把其中一个任务放到后台线程里。
下面是具体的解决方案和修改后的代码:
关键思路
把数据爬取的无限循环逻辑放到一个单独的后台线程中,让主线程专注运行Dash的Web服务。这样两个循环就能并行执行,互不阻塞。
修改后的代码示例
import threading import dash import dash_bootstrap_components as dbc # 导入你的db、hp、fd模块 app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) database = db.dataBase() homepage = hp.homepage(database) homepage.timeUpdateCallback(app) homepage.gaugeRefreshCallback(app) # 定义启动数据爬取的函数,把爬虫的无限循环逻辑封装在这里 def run_data_mining(): # 实例化爬虫类(假设这个类的初始化或内部逻辑会启动无限循环爬取) data_miner = fd.financeData(database, 1600) # 如果你的爬虫类是通过某个方法启动循环的,比如start(),就改成: # data_miner.start() # 创建并启动后台线程,设置daemon=True确保线程随主线程退出而终止 mining_thread = threading.Thread(target=run_data_mining, daemon=True) mining_thread.start() app.layout = homepage.layoutMaker() if __name__ == "__main__": # 注意:debug模式下Dash会自动重启进程,可能导致重复创建线程,调试时可以先关闭debug app.run_server(debug=False)
额外注意事项
- 线程安全的数据库操作:如果两个线程(爬虫和Dash回调)同时读写数据库,要确保你的数据库连接是线程安全的。比如用SQLite的话,需要在创建连接时设置
check_same_thread=False,或者使用数据库连接池来避免冲突。 - Dash的debug模式问题:开启
debug=True时,Dash会启动自动重载机制,这会导致脚本重复执行,后台线程可能被多次创建。调试阶段建议关闭debug,或者添加一个全局标志位来判断线程是否已经启动,避免重复创建。 - 如果爬虫有独立的启动方法:如果你的
financeData类不是在初始化时启动循环,而是有专门的启动方法(比如start_mining()),那线程的target应该指向这个方法,比如:data_miner = fd.financeData(database, 1600) mining_thread = threading.Thread(target=data_miner.start_mining, daemon=True) mining_thread.start()
这样调整后,数据爬取会在后台线程持续运行,主线程的Dash服务也能正常启动并实时读取数据库中的数据了。
内容的提问来源于stack exchange,提问作者Balázs Patai
相关产品推荐
相关产品推荐

