0

0

使用 Eel 和 Python 在 Web 前端异步加载图片

霞舞

霞舞

发布时间:2025-10-02 20:24:01

|

536人浏览过

|

来源于php中文网

原创

使用 eel 和 python 在 web 前端异步加载图片

在构建基于 Eel 的 Web 应用时,经常会遇到需要在 Python 函数执行过程中更新前端界面的需求,例如显示图片。然而,如果 Python 函数执行时间过长,会导致前端界面阻塞,图片无法及时加载,直到 Python 函数执行完毕。为了解决这个问题,我们需要将耗时的 Python 函数异步执行,避免阻塞主线程。

异步加载图片的原理

问题的关键在于,Eel 的 eel.expose 装饰器将 Python 函数暴露给 JavaScript 调用,但默认情况下,JavaScript 对 Python 函数的调用是同步的。这意味着 JavaScript 代码会等待 Python 函数执行完毕才会继续执行。因此,当 generate() 函数调用 eel.set_image() 后,浏览器会等待 generate() 函数完全执行完毕,才会渲染 <img> 标签。

为了解决这个问题,我们需要将耗时的 Python 代码放入一个异步任务中执行。这样,generate() 函数可以立即返回,允许浏览器继续渲染页面,而异步任务会在后台执行,不会阻塞主线程。

使用 Celery 实现异步任务

Celery 是一个流行的 Python 异步任务队列。它可以将任务分发给多个 worker 执行,从而提高程序的并发能力和响应速度。

立即学习Python免费学习笔记(深入)”;

1. 安装 Celery 和 Redis (或 RabbitMQ):

首先,需要安装 Celery 和一个消息代理,例如 Redis 或 RabbitMQ。Redis 通常更容易设置,因此我们这里使用 Redis 作为示例。

pip install celery redis

2. 创建 Celery 配置文件 (celeryconfig.py):

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载
# celeryconfig.py
broker_url = 'redis://localhost:6379/0'  # Redis 连接 URL
result_backend = 'redis://localhost:6379/0' # Redis 连接 URL
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Asia/Shanghai'  # 设置时区,根据你的实际情况修改
enable_utc = True

3. 修改 Python 代码:

import eel
import celery
from celery import Celery

# 初始化 Celery
celery_app = Celery('my_app', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')
celery_app.config_from_object('celeryconfig')

@celery_app.task
def long_running_task(source, keyword):
    # code that takes a long time to execute 2
    # 模拟耗时操作
    import time
    time.sleep(5)
    print(f"Task completed with source: {source}, keyword: {keyword}")
    return "Task completed"

@eel.expose
def generate(source, keyword):
    eel.set_image()  # 立即更新图片
    long_running_task.delay(source, keyword) # 异步执行耗时任务
    return "Image updated, task started in background"

@eel.expose
def set_image():
    # This function doesn't need to do anything in Python anymore, 
    # as it's primarily handled by the Javascript code.
    print("set_image called from javascript")

4. 修改 JavaScript 代码:

eel.expose(set_image);

function set_image() {
    document.getElementById("zoom-animate").innerHTML = '<img src="temp.png">';
}

function generate() {
    let source = document.getElementById("source").value;
    let keyword = document.getElementById("keyword").value;
    eel.generate(source, keyword).then(result => {
        console.log(result); // 输出 "Image updated, task started in background"
    });
}

5. 启动 Celery worker:

在终端中运行以下命令来启动 Celery worker:

celery -A your_module worker -l info

将 your_module 替换为包含 Celery 应用的 Python 文件的名称。例如,如果你的 Python 文件名为 main.py,则命令为 celery -A main worker -l info。

解释:

  • celery_app = Celery(...): 初始化 Celery 应用,配置消息代理和结果存储。
  • @celery_app.task: 将 long_running_task 函数注册为 Celery 任务。
  • long_running_task.delay(source, keyword): 异步执行 long_running_task 函数,并将 source 和 keyword 作为参数传递给它。delay 方法会将任务添加到 Celery 队列中,由 worker 异步执行。
  • eel.set_image() 在 long_running_task.delay 之前调用,这样可以确保在 Python 任务启动之前,图片就已经在前端更新。
  • 在 JavaScript 中,eel.generate(source, keyword) 返回一个 Promise,可以使用 .then() 方法来处理 Python 函数的返回值。

注意事项

  • 确保 Redis 或 RabbitMQ 服务器已启动并正在运行。
  • Celery worker 需要在与 Eel 应用相同的环境中运行。
  • 在 Celery 任务中,避免直接操作 Eel 对象,因为 Celery 任务是在独立的进程中运行的。如果需要在 Celery 任务中更新前端界面,可以使用 Eel 的 eel.spawn() 方法来执行 JavaScript 代码。

总结

通过使用 Celery 这样的异步任务队列,我们可以将耗时的 Python 代码放入后台执行,避免阻塞前端界面,从而提高 Web 应用的响应速度和用户体验。这种方法特别适用于需要在 Python 函数执行过程中更新前端界面的场景,例如显示进度条、加载图片等。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

49

2026.01.28

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

337

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

429

2023.10.12

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1007

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

673

2023.11.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号