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

使用Eel框架开发程序:启动循环函数后无法触发停止函数的问题求助

解决Eel框架中循环阻塞主线程导致无法响应函数调用的问题

你猜的一点没错!那个while run循环直接把Python的主线程给占满了——Eel的所有JS和Python之间的通信请求,都是靠主线程来处理消息队列的,主线程被死循环卡着,自然没法响应stop()的调用了。

下面给你两个实用的解决方案,根据你的场景选就行:

方案一:用线程把循环放到后台执行

把耗时/阻塞的循环放到子线程里,让主线程腾出手来处理Eel的通信请求,这是最通用的解决思路。

修改后的Python代码如下:

import eel
import threading

eel.init('web')
run = 1

def loop_task():
    global run
    while run:
        print("loop")

@eel.expose
def start():
    global run
    run = 1
    # 启动子线程执行循环,daemon=True保证程序退出时线程自动结束
    threading.Thread(target=loop_task, daemon=True).start()

@eel.expose
def stop():
    global run
    run = 0
    print("stopped................................")

if __name__ == '__main__':
    eel.start('index.html')

注意点:

  • 把循环逻辑抽成单独的loop_task函数,交给线程执行
  • 设置daemon=True是为了让主线程退出时,子线程也跟着结束,避免残留后台线程
  • 如果你的循环里有更复杂的共享数据操作,记得用threading.Lock()来保证线程安全,防止竞态问题

方案二:在循环中加入eel.sleep()让出时间片

如果你的循环逻辑不复杂,也可以不用线程,只要在循环里调用eel.sleep()——这个函数会让主线程暂时放下循环,去处理Eel的消息队列(包括JS发来的stop()请求)。

修改后的Python代码如下:

import eel

eel.init('web')
run = 1

@eel.expose
def start():
    global run
    run = 1
    while run:
        print("loop")
        # 每次循环让出一点时间给Eel处理消息,时间可以根据需求调整
        eel.sleep(0.01)

@eel.expose
def stop():
    global run
    run = 0
    print("stopped................................")

if __name__ == '__main__':
    eel.start('index.html')

适用场景:

这个方案代码更简洁,适合IO密集型的循环(比如需要定期查询状态、等待外部事件),但如果是CPU密集型的计算,还是推荐用线程方案,避免拖慢UI响应。

两种方案都能解决你的问题,测试下哪个更符合你的需求就行!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:54:09