Ich erstelle Bildungsvideos über Programmierung, die sich an Anfänger richten. Eine wichtige Aufgabe für mich ist das Schreiben der Skripte für Voice-Overs, die einen Codeblock beschreiben. Ich möchte, dass meine Skripte kurz sind und jede Zeile des Codes beschreiben, normalerweise mit einem einfachen Satz pro Zeile, wenn es einfach ist. Hier ist eine Beispielfunktion, für die ich möchte, dass du das Skript erstellst:

```rust
pub fn spawn_task(commands: &mut Commands, prompt: String) {
    let thread_pool = AsyncComputeTaskPool::get();

    let task = thread_pool.spawn(async move { call_open_ai_api(prompt) });

    // Neue Entität erstellen und unsere neue Aufgabe als Komponente hinzufügen
    commands.spawn(OpenAiTask(task));
}```
In diesem Bildungsvideo werden wir uns die Funktion `spawn_task` ansehen, die eine mutable Referenz auf `Commands` und einen String namens `prompt` akzeptiert. Lass uns diese Funktion Zeile für Zeile durchgehen:

1. Wir erstellen zunächst eine Referenz auf einen `thread_pool`, indem wir `AsyncComputeTaskPool::get()` aufrufen. Dadurch erhalten wir eine gemeinsam genutzte Instanz eines asynchronen Berechnungsaufgabenpools.
2. Anschließend erstellen wir eine neue Aufgabe, indem wir `thread_pool.spawn()` aufrufen. Innerhalb der `spawn()`-Methode verwenden wir einen async-Block mit dem Schlüsselwort `move`, um sicherzustellen, dass der Besitz von `prompt` in den Block übertragen wird. Dann rufen wir die Funktion `call_open_ai_api()` mit `prompt` als Argument auf.
3. Danach haben wir einen Kommentar, der den nächsten Schritt beschreibt: das Erzeugen einer neuen Entität und das Hinzufügen unserer neuen `Aufgabe` als Komponente.
4. Schließlich verwenden wir `commands.spawn()`, um eine neue Entität zu erstellen, und wir fügen die `OpenAiTask`-Komponente hinzu, wobei wir die zuvor erstellte `Aufgabe` übergeben.

Und das ist es! Diese Funktion zeigt, wie man eine neue Aufgabe erstellt, sie mit einem asynchronen Thread-Pool spawnen und sie einer neuen Entität im Commands-System hinzufügen kann.