2010-01-26 5 views
0

Dans Ruby, j'ai une action de contrôleur qui lance immédiatement une tâche de calcul intensif qui prend plusieurs secondes. Je souhaite que le client interroge mon serveur et obtienne des mises à jour de statut.Où stocker des données temporaires dans des rails

dans mon contrôleur:

def complex_task 
    Thread.new do 
    loop do 
     one_part_of_the_computationally_intensive_task 
     # Note how much progress we've made, in case the client asks. 
     save_progress 
    end 
    end 
    # returns to client straightaway, but task continues in background. 
end 

def check_status 
    # Retrieve state in here. 
    get_progress 
end 

Notez comment check_status doit tirer l'état qui est stocké par le thread séparé.

Comment puis-je écrire les fonctions save_progress et get_progress? Où puis-je stocker l'état? Il semble que ce n'est pas une bonne idée de le stocker dans session, puisque cela est envoyé au client, mais où puis-je le stocker?

(lié à this question, mais beaucoup plus général. J'attends des réponses tout à fait différentes.)

Répondre

3

Jetez un oeil à delayed_job. Vous pouvez facilement étendre ce afin que les emplois peuvent écrire des progrès dans la table delayed_jobs, pour l'extraction ultérieure par votre méthode check_status() (ou vous pouvez même ajouter set_status() et check_status() à delayed_job ...)

Notez que delayed_job a été extrait de Shopify ; Je suppose que cela signifie qu'il a eu une exposition solide dans le monde réel. Je préférerais partir d'une base comme celle-là plutôt que de rouler la mienne, à moins d'avoir une raison assez convaincante.

1

Vous pouvez stocker l'état dans un modèle, et de mettre la status_id dans la session. Alternativement, vous pourriez utiliser un magasin de session de base de données au lieu d'un magasin basé sur un cookie, qui garderait les données que vous mettez dans la session côté serveur au détriment de la vitesse de session.

Questions connexes