‌React Native后台任务高效执行:Background Job实战攻略‌

# ‌‌‌‌‌‌‌‌‌‌‌‌‌React Native 后台任务高效执行:Background Job 实战攻略

在移动应用中,后台任务(Background Job)非常常见,例如定时拉取数据、上传日志、地理位置跟踪、离线消息同步、播放音乐等。然而由于 iOS 与 Android 系统对后台执行的限制,各平台实现方式各异,且有诸多陷阱与注意事项。本文将从原理出发,结合实战代码示例与 ASCII 图解,帮助你在 React Native 中高效实现后台任务,覆盖常用场景与优化建议,让你快速上手并避免踩坑。

---

## 目录

1. [背景与挑战](#一-背景与挑战)  
2. [常见实现方案与对比](#二-常见实现方案与对比)  
   1. [Headless JS(仅 Android)](#21-headless-js仅-android)  
   2. [react-native-background-fetch](#22-react-native-background-fetch)  
   3. [react-native-background-task](#23-react-native-background-task)  
   4. [react-native-background-actions](#24-react-native-background-actions)  
3. [实战示例:周期性任务与一次性任务](#三-实战示例周期性任务与一次性任务)  
   1. [使用 react-native-background-fetch 周期性执行](#31-使用-react-native-background-fetch-周期性执行)  
   2. [使用 Headless JS 在 Android 端执行一次性任务](#32-使用-headless-js-在-android-端执行一次性任务)  
4. [高级技巧与注意事项](#四-高级技巧与注意事项)  
   1. [iOS Background Modes 配置](#41-ios-background-modes-配置)  
   2. [Android 前台服务与电池优化](#42-android-前台服务与电池优化)  
   3. [任务调度时机与系统限制](#43-任务调度时机与系统限制)  
5. [图解:后台任务整体执行流程](#五-图解后台任务整体执行流程)  
6. [总结与最佳实践](#六-总结与最佳实践)  

---

## 一、背景与挑战

在 React Native 应用中,我们时常需要让应用在**切换到后台**或**被系统杀死**后,仍能继续执行某些关键逻辑,如:

- **定时同步**:每隔一段时间从服务器拉取最新数据(天气、股票、消息推送等)。  
- **上传日志**:收集设备日志、用户行为,定期上报。  
- **音乐播放/计步**:即使应用在后台,也能持续播放音乐或统计步数。  
- **地理位置跟踪**:实时获取用户位置并上传,用于导航或物流场景。  

但在 iOS 与 Android 上实现后台任务面临诸多挑战:

1. **iOS 限制更严格**  
   - iOS 从 7.0 开始引入 **Background Modes**,只允许少数几类后台执行(例如 VoIP、音频播放、定位、蓝牙、后台 fetch)。  
   - 普通 JavaScript 代码在 iOS 端一旦进入后台很快就会被挂起,无法长时间存活。  
2. **Android 电池优化**  
   - Android 6.0+ 引入 Doze 模式,对后台进程有严格限制,系统会暂停网络和调度 Alarm,延后任务执行。  
   - 需要使用 前台服务(Foreground Service)或 JobScheduler / WorkManager 等来保障任务不被杀死。  
3. **React Native layer 的局限**  
   - JavaScript 线程只有在 App 未被系统回收时才会存活;若 App 被杀,JS 线程也将终止。  
   - 因此常借助 **Headless JS** 或原生模块来“唤醒” JS 执行任务。  

综上,需要结合多种技术手段:原生配置(Info.plist、AndroidManifest.xml)、第三方库、Headless JS、前台服务等,才能在 RN 中实现可靠的后台任务。

---

## 二、常见实现方案与对比

下面我们先简单对比几种常见方案及其优缺点,帮助你选择最适合自己场景的方法。

### 2.1 Headless JS(仅 Android)

- **原理**:在 Android 端,React Native 暴露了 Headless JS 接口,可以在应用被杀或在后台时,通过原生模块启动 JS 任务并执行一段逻辑。  
- **优点**:  
  - 无需第三方库,系统原生方案。  
  - 在 App 不在前台时,可以触发一次性任务。  
- **缺点**:  
  - 仅限 Android,iOS 不支持。  
  - 适合一次性执行任务(如接收到推送后执行上传),不适合严格定时任务。  

### 2.2 react-native-background-fetch

- **原理**:基于 iOS 的 `Background Fetch` API 和 Android 的 `JobScheduler` / `AlarmManager`,自动帮你调度周期性任务。  
- **优点**:  
  - 跨平台支持,iOS/Android 均可使用。  
  - 默认仅在系统空闲且网络可用时调度,节省电量。  
  - API 简单:只需注册回调即可。  
- **缺点**:  
  - 调度频率由系统决定,无法精确到秒级,iOS 端约 15 分钟一次,Android 受 Doze 影响也不保证精准。  
  - 不支持长时间持续任务,只适合“定时拉取”场景。  

### 2.3 react-native-background-task

- **原理**:通过原生模块封装 iOS/Android 的定时调度接口(iOS 的后台 fetch + Android 的 JobScheduler)实现周期性任务。  
- **优点**:  
  - 配置较简单,API 接近使用习惯。  
  - 支持在 App 被杀死后依旧能执行。  
- **缺点**:  
  - 库作者维护不够及时,社区问题较多。  
  - 同样无法保证精准定时。  

### 2.4 react-native-background-actions

- **原理**:使用 Android 的前台服务和 iOS 的长时后台模式(Audio/Location)来保持 JS 持续运行。  
- **优点**:  
  - 可以在后台长时间运行一个 JS 函数,适用于需要持续执行的场景(如计步、下载)。  
  - 支持进度通知栏提示(Android),保持服务存活。  
- **缺点**:  
  - iOS 端需要打开某个后台模式(如 Audio 或 Location),否则长任务会被暂停。  
  - 用户体验上需要告知用户正在后台运行,以防电量消耗引起投诉。  

---

## 三、实战示例:周期性任务与一次性任务

下面我们针对常见场景提供两个实战示例,一是**周期性任务**(定时拉取数据),二是**一次性后台任务**(在接收到系统事件后执行)。

### 3.1 使用 react-native-background-fetch 周期性执行

本节示例展示如何使用 `react-native-background-fetch` 实现每隔大约 15 分钟拉取一次服务器数据,既支持 iOS 也支持 Android。

#### 3.1.1 安装与原生配置

```bash
# 安装依赖
yarn add react-native-background-fetch
# 或 npm install react-native-background-fetch --save

iOS 配置

  1. ios/Podfile 中添加:

    pod 'react-native-background-fetch', :path => '../node_modules/react-native-background-fetch'
  2. 执行 cd ios && pod install && cd ..
  3. 在 Xcode 中打开 Info.plist,添加:

    <key>UIBackgroundModes</key>
    <array>
      <string>fetch</string>
    </array>
  4. AppDelegate.m#import "RNBackgroundFetch.h",并在 didFinishLaunchingWithOptions 中添加:

    [[RNBackgroundFetch sharedInstance] didFinishLaunching];
  5. application:performFetchWithCompletionHandler: 中添加:

    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      [[RNBackgroundFetch sharedInstance] performFetchWithCompletionHandler:completionHandler];
    }

Android 配置

  1. android/app/src/main/AndroidManifest.xml 中,添加权限和服务:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <application ...>
      ...
      <!-- 添加 BackgroundFetch 服务 -->
      <service android:name="com.transistorsoft.rnbackgroundfetch.HeadlessJobService" android:exported="false"/>
      <receiver android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
          <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
        </intent-filter>
      </receiver>
    </application>
  2. MainApplication.java 中:

    import com.transistorsoft.rnbackgroundfetch.RNBackgroundFetchPackage;
    // ...
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new RNBackgroundFetchPackage()
      );
    }

3.1.2 JS 端代码示例

// src/backgroundFetchTask.js
import BackgroundFetch from 'react-native-background-fetch';
import { Alert } from 'react-native';

// 后台任务执行的逻辑
let backgroundFetchTask = async () => {
  console.log('[BackgroundFetch] Event received');
  try {
    // 1. 执行你的后台业务逻辑,例如拉取服务器最新数据
    let response = await fetch('https://api.example.com/data');
    let data = await response.json();
    console.log('[BackgroundFetch] Fetched data:', data);

    // 2. 根据业务需要,存储到本地数据库或发本地通知
    // ...
  } catch (error) {
    console.error('[BackgroundFetch] Fetch error:', error);
  }
  // 3. 告诉系统任务已完成
  BackgroundFetch.finish(BackgroundFetch.FETCH_RESULT_NEW_DATA);
};

// 注册 Headless JS 任务(Android 被系统杀死后仍能执行)
BackgroundFetch.registerHeadlessTask(backgroundFetchTask);

export default backgroundFetchTask;
// src/App.js
import React, { useEffect } from 'react';
import { View, Text, StyleSheet, Button, Alert } from 'react-native';
import BackgroundFetch from 'react-native-background-fetch';
import backgroundFetchTask from './backgroundFetchTask';

export default function App() {
  useEffect(() => {
    initBackgroundFetch();
  }, []);

  const initBackgroundFetch = async () => {
    // 请求权限并配置任务参数
    const status = await BackgroundFetch.configure(
      {
        minimumFetchInterval: 15, // 以分钟为单位,iOS 最小为 15 分钟
        stopOnTerminate: false,   // 应用被杀时是否停止任务
        enableHeadless: true,     // Android: 允许被杀死后 Headless 执行
        startOnBoot: true,        // Android: 重启后自动启动
        requiredNetworkType: BackgroundFetch.NETWORK_TYPE_ANY, // 任意网络
      },
      // 成功回调
      async (taskId) => {
        console.log('[BackgroundFetch] taskId:', taskId);
        await backgroundFetchTask(); // 执行实际逻辑
        BackgroundFetch.finish(taskId);
      },
      // 失败回调
      (error) => {
        console.error('[BackgroundFetch] configure error:', error);
      }
    );

    console.log('[BackgroundFetch] configure status:', status);
    if (status !== BackgroundFetch.STATUS_AVAILABLE) {
      Alert.alert('BackgroundFetch 权限不可用:' + status);
    }
  };

  // 手动触发测试
  const onTestPress = async () => {
    console.log('[BackgroundFetch] Performing manual fetch');
    await backgroundFetchTask();
  };

  return (
    <View style={styles.container}>
      <Text style={styles.title}>React Native 后台任务演示</Text>
      <Button title="手动触发后台任务" onPress={onTestPress} />
      <Text style={styles.note}>
        后台任务会在应用切换至后台或系统调度时自动触发,无法保证绝对定时。
      </Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 16 },
  title: { fontSize: 20, fontWeight: 'bold', marginBottom: 16 },
  note: { marginTop: 12, color: '#666', textAlign: 'center' },
});

3.1.3 运行与验证

  1. 启动应用

    yarn android   # 或 yarn ios
  2. 切换至后台,等待 \~15 分钟后查看日志输出(Android Studio Logcat / Xcode Console)。
  3. 手动触发:点击 “手动触发后台任务” 按钮,立即执行 backgroundFetchTask,查看日志。
提示:iOS 模拟器不完全支持后台 Fetch,请在真机上测试;Android 真机或部分模拟器可用。

3.2 使用 Headless JS 在 Android 端执行一次性任务

Headless JS 适用于:应用在后台或被系统杀死后,接收推送通知(如 FCM)、系统事件(如 Boot Completed)后执行一次性 JS 逻辑。下面演示一个在 Android 端监听 BootCompleted 后执行清理缓存的示例。

3.2.1 Android 原生配置

  1. 创建 Headless 服务
    android/app/src/main/java/com/myapp/HeadlessTask.java 中:

    package com.myapp;
    
    import android.content.Intent;
    import android.util.Log;
    import com.facebook.react.HeadlessJsTaskService;
    
    public class HeadlessTask extends HeadlessJsTaskService {
      @Override
      protected void onStartCommand(Intent intent, int flags, int startId) {
        Log.d("HeadlessTask", "Boot Completed, starting headless task");
        // 参数:任务名称,对应 JS registerTask
        startTask("BootCleanupTask", null);
        return super.onStartCommand(intent, flags, startId);
      }
    }
  2. 注册广播接收器
    AndroidManifest.xml 中添加:

    <receiver android:name=".BootReceiver" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
    <service android:name=".HeadlessTask" android:exported="false" />

    然后新建 BootReceiver.java

    package com.myapp;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    public class BootReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
          Log.d("BootReceiver", "Device Boot Completed");
          Intent serviceIntent = new Intent(context, HeadlessTask.class);
          context.startService(serviceIntent);
        }
      }
    }
  3. MainApplication.java 注册 Headless JS 任务

    import com.facebook.react.HeadlessJsTaskService;
    // ...
    public class MainApplication extends Application implements ReactApplication {
      @Override
      public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
        // 无需额外操作,HeadlessJsTaskService 会读取 JS 端注册
      }
    }

3.2.2 JS 端注册 Headless 任务

// src/bootCleanupTask.js
import { AppRegistry } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';

const BootCleanupTask = async () => {
  console.log('[BootCleanupTask] Started');

  try {
    // 执行缓存清理逻辑
    await AsyncStorage.clear();
    console.log('[BootCleanupTask] Cache cleared successfully');
  } catch (error) {
    console.error('[BootCleanupTask] Error clearing cache:', error);
  }
  // 任务完成后不需显式调用 finish,HeadlessJsTaskService 会自动结束
};

// 在 JS 入口(index.js)中注册任务
AppRegistry.registerHeadlessTask('BootCleanupTask', () => BootCleanupTask);

说明

  • 当 Android 系统启动完成后,BootReceiver 会接收到 BOOT_COMPLETED 事件,启动 HeadlessTask 服务;
  • HeadlessTask 在原生端调用 startTask("BootCleanupTask") 唤醒 JS 引擎执行 BootCleanupTask
  • JS 端清理完缓存后,服务自动结束。

3.2.3 测试步骤

  1. 安装应用并授予接收开机启动权限:

    adb shell pm grant com.myapp android.permission.RECEIVE_BOOT_COMPLETED
  2. 重启设备(或模拟器)
  3. 在 Android Studio Logcat 中搜索 BootCleanupTask 日志,验证是否成功触发。

四、高级技巧与注意事项

实际项目中,后台任务需要结合系统限制与用户体验进行优化。下面列出若干高级技巧与常见注意事项。

4.1 iOS Background Modes 配置

iOS 对后台执行做了严格限制,仅允许以下几类模式:

  1. Background Fetch

    • 允许系统定期唤醒应用进行数据拉取。无需长时间驻留,系统根据使用频率与用户习惯动态调整频率。
  2. Push Notifications

    • 收到静默推送后可短暂唤醒应用,执行少量任务(如同步)。静默推送需在 aps 里加 "content-available": 1
  3. VoIP / Audio / Location / Bluetooth

    • 如果应用有持续播放音频、实时语音通话、持续定位、蓝牙外设通信等需求,可在 Xcode 项目的 Background Modes 中勾选相应权限,使 App 在后台保持运行。

示例:配置静默推送
Info.plist 中:

<key>UIBackgroundModes</key>
<array>
  <string>location</string>
  <string>remote-notification</string>
</array>

推送 payload:

{
  "aps": {
    "content-available": 1
  },
  "customData": { ... }
}

iOS 收到该推送后会调用 AppDelegate 的 didReceiveRemoteNotification:fetchCompletionHandler:,可在 JS 端通过 react-native-push-notification 或自定义桥接来执行静默任务。

4.2 Android 前台服务与电池优化

对于需要持续运行的后台任务(如 GPS 跟踪、音乐播放),仅靠 Headless JS 或 BackgroundFetch 不够,需要前台服务(Foreground Service)

  • 前台服务:在 Android 上运行一个常驻服务,必须携带通知栏通知,告知用户应用在后台持续执行任务。示例库:react-native-background-actionsreact-native-foreground-service

    import BackgroundService from 'react-native-background-actions';
    
    const options = {
      taskName: 'LocationTracking',
      taskTitle: '正在后台跟踪位置',
      taskDesc: '应用正在后台记录你的位置信息',
      taskIcon: {
        name: 'ic_launcher',
        type: 'mipmap',
      },
      parameters: {
        interval: 10000, // ms
      },
    };
    
    const veryIntensiveTask = async (taskData) => {
      const { interval } = taskData;
      for (let i = 0; BackgroundService.isRunning(); i++) {
        // 获取位置并发送到服务端
        const location = await Geolocation.getCurrentPosition();
        await fetch('https://api.example.com/loc', {
          method: 'POST',
          body: JSON.stringify(location),
        });
        await new Promise((resolve) => setTimeout(resolve, interval));
      }
    };
    
    // 启动前台服务
    const startService = async () => {
      await BackgroundService.start(veryIntensiveTask, options);
    };
    
    // 关闭服务
    const stopService = async () => {
      await BackgroundService.stop();
    };
  • 电池优化 (Doze / App Standby):Android 6.0+ 默认启用 Doze,会暂停普通后台定时任务,若不加入白名单,任务可能被延迟。可在用户引导页使用:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
      Intent intent = new Intent();
      String packageName = context.getPackageName();
      PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
      if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        context.startActivity(intent);
      }
    }

    让用户手动给予“忽略电池优化”权限。但需要注意,这会影响应用在后台运行的稳定性且会被部分用户拒绝。

4.3 任务调度时机与系统限制

  • iOS Fetch 时间不准:iOS 会根据用户使用情况、系统电量等智能调整后台 Fetch 的触发间隔,一般在 15 分钟到几小时不等,开发者无法硬性控制。
  • Android JobScheduler / WorkManager 延迟:受 Doze 和 App Standby 限制,任务可能被延迟,为了提高执行几率,尽量使用前台服务或请求设备保持唤醒。
  • 避免长时间占用 JS 线程:即使后台 JS 唤醒,也要保证任务执行尽快结束,并在完成后调用 BackgroundFetch.finish() 或停止 Headless 任务,否则系统会认为任务超时并可能对应用后台行为做限制。

五、图解:后台任务整体执行流程

下面用 ASCII 图解展示一个典型的“后台 Fetch + Headless JS + 前台 Service”混合场景,帮助理清逻辑流程。

┌───────────────────────────────┐
│         用户打开 APP           │
│     (React Native JS 线程启动)  │
└───────────────────────────────┘
                │
                ▼
┌────────────────────────────────────┐
│  初始化 BackgroundFetch & Headless  │
│  - 配置周期性 Fetch (iOS/Android)   │
│  - 注册 BootCompleted 等 Headless   │
└────────────────────────────────────┘
                │
                ▼
      用户切换 APP 至后台或退出
                │
          (进入后台/被杀)      
                │
          iOS / Android 系统      
                ▼
┌───────────────────────────────┐     ┌─────────────────────────────┐
│  iOS 系统调度 Background Fetch  │     │ Android 系统调度 JobScheduler │
│   (约 15 分钟间隔,Fetch 回调)   │     │  或 AlarmManager / WorkManager │
└───────────────────────────────┘     └─────────────────────────────┘
                │                           │
       回调触发 JS Fetch 任务             HeadlessJS 或 Alarm
                │                           │
                ▼                           ▼
┌───────────────────────────┐      ┌────────────────────────────────┐
│  JS 线程唤醒执行 fetchTask │<─────│ Headless JS Service (Android) │
│  - 拉取数据,处理逻辑        │      │ - 接收到推送 / BootCompleted   │
│  - 调用 BackgroundFetch.finish() │  │ - 调用 JS Task 注册回调         │
└───────────────────────────┘      └────────────────────────────────┘
                │                           │
                ▼                           ▼
┌───────────────────────────────┐  (如需长期运行) 
│ 上传数据 / 本地存储 / 发本地通知   │◀────────────────────────────────┐
└───────────────────────────────┘     在 Android 使用
                │                      ForegroundService 等
                ▼
┌───────────────────────────────┐
│     后台任务完成,JS 线程挂起     │
└───────────────────────────────┘
  1. 初始化阶段:应用一启动就配置好 BackgroundFetch,并在 Android 上注册 HeadlessJS 任务(如 BootCleanupTask)。
  2. 系统调度阶段:iOS 每隔约 15 分钟唤醒应用执行后台 Fetch;Android 通过 JobScheduler / AlarmManager 调度 HeadlessJS
  3. 执行阶段:系统通过回调将控制权交给 JS 线程,执行注册的 fetchTaskHeadless Task,完成数据拉取 / 清理 / 上传等操作。
  4. 前台服务场景:若需要持续执行(如位置跟踪),可在应用进入后台时启动 Android Foreground Service,时刻保持 JS 线程运行。
  5. 收尾阶段:一旦任务执行完毕,调用相关回调(BackgroundFetch.finish())或让 HeadlessJS 服务自动停止,减少电量消耗。

六、总结与最佳实践

本文介绍了在 React Native 中实现后台任务的多种方案,涵盖:

  • 周期性任务:使用 react-native-background-fetch 实现 iOS/Android 平台上的定时拉取。
  • 一次性任务:利用 Android 的 Headless JS 在系统事件(如开机)时执行逻辑。
  • 持续后台任务:通过 Android 前台服务(Foreground Service)保持 JS 线程持续运行,适用于 GPS 跟踪、音乐播放等场景。
  • iOS 特殊限制:通过 Background Modes(静默推送、后台 fetch、定位、音频等)保持应用后台执行能力。

最佳实践与注意事项:

  1. 尽量减少后台任务耗时

    • 后台执行时间有限,尤其是 iOS,无法长时间运行。尽快完成任务,并调用 finish()
  2. 合理使用前台服务

    • 对于需要持续后台运行的场景(如计步、导航),在 Android 上必须使用前台服务并显示持续通知;iOS 上需使用合规的后台模式(如 audio / location)。
  3. 尊重用户体验与电量

    • 后台任务会消耗系统资源,过度使用会导致电量快速下降,影响用户体验。
    • 在用户设置中允许“关闭后台刷新”时,要优雅降级或提醒用户手动打开。
  4. 监测并捕获异常

    • 后台任务异常崩溃可能导致后续任务无法执行,需加上全局异常捕获与日志上报机制。
  5. 依赖系统调度,不要期望秒级定时

    • 系统会根据电量、使用频率动态调整后台执行间隔。不要指望精准到秒级的定时任务,可在前台唤醒时做补偿。

通过本文的示例与图解,你应该能在 React Native 中灵活运用上述技术,实现大多数后台需求。如果项目对后台执行有更严格的实时性要求,建议在原生端结合 JobScheduler / WorkManager(Android)或 PushKit / BGAppRefreshTask(iOS 13+)来进行更精细的控制,并在必要时编写自定义原生模块进行扩展。

最后修改于:2025年05月29日 11:26

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日