Skip to main content
Ce guide vous aide à choisir entre les modèles synchrones et asynchrones dans le SDK Python de sandbox CoreWeave (cwsandbox) et présente les variantes synchrone et asynchrone de chaque opération courante. En interne, le SDK repose sur une implémentation asynchrone unique. Le choix entre synchrone et asynchrone tient uniquement à la manière dont vous consommez les résultats : utilisez .result() en mode synchrone et await en mode asynchrone.

Choisir l’authentification

Ces exemples s’exécutent sur une capacité sans serveur, sauf si une section indique CKS. Choisissez l’identifiant d’authentification du compte propriétaire de vos Sandbox. Pour obtenir une clé ou un jeton, consultez Choisir et obtenir des identifiants d’authentification. Exécutez les commandes d’installation dans un environnement virtuel Python actif. Enregistrez le code Python de l’onglet correspondant à votre identifiant d’authentification sous le nom sandbox_auth.py, dans le même répertoire que les scripts Python que vous exécutez depuis cette page. Ce fichier enregistre le mode d’authentification choisi, et non votre identifiant d’authentification. Les exemples importent AUTH depuis ce fichier et le transmettent explicitement à chaque nouvelle Sandbox ou session.
Utilisez votre clé API Forge avec la stratégie d’authentification W&B du SDK :
sandbox_auth.py
Pour un placement sur CKS, choisissez le jeton CoreWeave, activez un exécuteur et définissez placement_mode="cks" lors de la création de la Sandbox ou dans SandboxDefaults. Créer une session avec auth=AUTH authentifie également les Sandbox qui lui appartiennent. Utilisez le même identifiant d’authentification pour vous reconnecter aux Sandbox, les lister ou les nettoyer.

Guide de décision rapide

Règle générale : privilégiez l’approche synchrone (.result()) pour plus de simplicité. Ne passez à await que si vous travaillez déjà dans une base de code asynchrone.

Concept fondamental : OperationRef

La plupart des méthodes du SDK renvoient OperationRef[T], un encapsuleur qui prend en charge à la fois l’appel à .result() et await. Les deux approches lèvent les mêmes exceptions.
Sandbox.exec() renvoie Process, qui étend OperationRef[ProcessResult] en y ajoutant la diffusion en continu et stdin.
N’utilisez jamais .result() dans un contexte asynchrone. Appeler .result() bloque le thread. Dans un contexte asynchrone, cela bloque la boucle d’événements et peut provoquer un interblocage de votre application. Utilisez plutôt await.

Comportement de démarrage automatique

session.sandbox() renvoie une sandbox non démarrée. La sandbox démarre automatiquement lors de la première opération qui la nécessite : Déclenchent le démarrage automatique : exec(), read_file(), write_file(), wait(), wait_until_complete() Ne déclenchent pas le démarrage automatique : get_status() (lève SandboxNotRunningError), stop() (no-op si la sandbox n’a jamais démarré)

Opérations

Créer des Sandbox

Sandbox.run() appelle start().result() en interne, ce qui bloque la boucle d’événements. Dans du code asynchrone, instanciez l’objet avec Sandbox(...) et utilisez async with pour démarrer la sandbox. exec() attend le statut RUNNING avant de s’exécuter. Pour attendre le démarrage séparément, utilisez await sandbox et vérifiez son statut avant toute opération.

start()

exec()

read_file()

write_file()

stop()

wait()

wait() attend le statut de démarrage. Par exemple, la méthode peut rendre la main lorsque la sandbox est RUNNING ou TERMINATING, ou une fois qu’elle s’est terminée avec succès. Elle est sync-only. Dans du code asynchrone, await sandbox effectue la même attente de démarrage sans bloquer la boucle d’événements. Un retour normal ne garantit pas l’état RUNNING. Vérifiez status avant toute opération qui nécessite une sandbox en cours d’exécution. Pour la gestion des états terminaux et des erreurs, consultez Attendre une sandbox.

wait_until_complete()

get_status()

get_status() est sync-only. Cette méthode récupère le statut actuel auprès de l’API.

Sandbox.list()

Sandbox.from_id()

Sandbox.delete()

session.list()

session.from_id()

Diffuser la sortie stdout en continu

Transmettre stdin en flux

Activez stdin avec stdin=True. Utilisez write() pour les octets bruts, writeline() pour les lignes de texte et close() pour signaler la fin de fichier (EOF).

cwsandbox.results()

cwsandbox.results() est un utilitaire de traitement par lot sync-only. Il appelle .result() sur un ou plusieurs objets OperationRef.

cwsandbox.wait()

cwsandbox.wait() est sync-only. Cette fonction attend une séquence d’objets Sandbox, OperationRef ou Process et renvoie (done, pending). Pour les Sandbox, elle applique la même attente de démarrage que Sandbox.wait(), plutôt que d’attendre la fin de la commande principale. Une sandbox présente dans done n’est pas nécessairement à l’état RUNNING : elle peut par exemple être déjà terminée ou en cours d’arrêt. Vérifiez le status de chaque sandbox avant toute opération qui exige qu’elle soit en cours d’exécution.

@session.function()

Exécution parallèle

L’API synchrone prend en charge l’exécution parallèle, car les opérations sont non-blocking dès la conception. Les méthodes telles que exec(), read_file() et write_file() rendent la main immédiatement. Le blocage n’intervient que lorsque vous appelez .result(). Sandbox.run() reste bloquante jusqu’à ce que le backend accepte la requête de démarrage (elle appelle start().result() en interne). Pour un démarrage parallèle, utilisez session.sandbox() (démarrage automatique à la première opération) ou collectez les réf. renvoyées par start() :

Notebooks Jupyter

L’API synchrone fonctionne dans Jupyter sans nest_asyncio, car le SDK exécute sa propre boucle d’événements en arrière-plan dans un thread démon :
Pour le code asynchrone dans Jupyter, vous pouvez utiliser await directement, car Jupyter dispose d’une boucle d’événements intégrée :

Gestion des erreurs

Les modes synchrone et asynchrone lèvent les mêmes exceptions. .result() relance toute exception issue de l’opération sous-jacente, tout comme await. Consultez Que signifient les messages d’erreur courants du SDK Sandbox ? pour connaître la hiérarchie complète des exceptions et les stratégies de récupération.
Dernière modification le 4 novembre 2026