3

J'utilise le pool de threads abordé dans https://github.com/meh/ruby-thread pour générer plusieurs téléchargeurs. Je tente de télécharger le contenu de nombreux flux RSS, soit près de 200 000 flux au total, mais j'ai des problèmes de verrouillage et de concurrence dans ma base de données MySQL lorsque j'appelle la méthode save d'ActiveRecord. Je suis assez sûr que j'ai besoin de désigner un seul thread pour interagir avec la base de données et envoyer des signaux à ce fil, mais je ne suis pas sûr exactement comment structurer cela.Comment utiliser un pool de threads pour écrire dans ma base de données?

Répondre

4

Regardez la classe Queue de Ruby.

Créez une file d'attente utilisée pour stocker les informations d'enregistrement avant d'envoyer les données à votre base de données. Tous vos fils RSS lui écrivent en tant que "producteurs".

Créez un nouveau thread qui lit uniquement à partir de cette file d'attente et écrit dans la base de données en tant que "consommateur". Il ne devrait pas avoir de mal à rester en avance sur les fils RSS.

Vous aurez besoin de join le code principal à tous les threads, y compris le consommateur DB, afin que tous les threads se terminent avant que l'application peut se fermer sinon vous pourriez vous retrouver avec des enregistrements non écrits.

Comme vous n'avez montré aucun code source, nous ne pouvons pas vous aider à l'intégrer, mais cela devrait être facile à faire.

Questions connexes