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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:02:30