J'essaie d'afficher un numéro à partir d'une API, mais je veux charger ma page plus rapidement. Donc, je voudrais obtenir le numéro de l'API toutes les 5 minutes, et il suffit de charger ce numéro sur ma page. C'est ce que j'ai. Cela fonctionne très bien, mais l'obtention de ce nombre à partir de l'API prend un certain temps, ce qui signifie que mon chargement de la page prend un peu de temps. Je veux consulter ce numéro à l'avance, puis toutes les cinq minutes. J'ai essayé d'utiliser des threads et des processus, mais je n'arrive pas à le comprendre. Je suis encore assez nouveau à la programmation.Impossible de lancer un processus en arrière-plan de l'application Sinatra
0
A
Répondre
1
Voici une manière assez simple d'obtenir des données dans un fil séparé. Quelque part en dehors de l'action du contrôleur, la boucle déclencher async:
Data = {}
numbers_api = Numbersapi.new
Thread.new do
Data[:number] = numbers_api.number
sleep 300 # 5 minutes
end
Ensuite, dans votre action de contrôleur, vous pouvez simplement se référer à la Data[:number]
, et vous obtiendrez la dernière valeur. Toutefois, si vous déployez ceci, vous devez utiliser une gemme comme Resque ou Sidekiq; il va suivre les échecs et est probablement optimisé plus
Regardez dans l'utilisation de sidekiq et redis. Le travail Sidekiq fonctionnera en arrière-plan, récupérera ces données coûteuses et les stockera en redis, à partir desquelles la valeur sera lue par votre application sinatra. –