2010-08-18 11 views
1

Je travaille sur un projet d'intégration API dans Ruby et j'étais sur le point de créer une méthode de classe pour suivre un peu ce que Rails fait avec les méthodes finder mais je me suis arrêté car je suis concerné, je pourrais introduire une condition de concurrence. Je ne stockerais rien dans les variables membres, j'instancierais simplement des objets avec la méthode class et j'appellerais des API externes, donc tout serait localement (dans la méthode de la classe). Cependant, n'est-il pas possible d'avoir une condition de concurrence puisque plusieurs threads passent par cette méthode de classe? Comment les méthodes de classe Finder de Rails évitent-elles cela? Ou est-ce que je ne comprends pas quelque chose à un niveau plus fondamental ici?Conditions de course dans les méthodes de classe Ruby

Répondre

2

Il est possible que vous ne compreniez pas le fonctionnement des threads, ou que vous ne décrivez pas une partie de votre problème qui serait à l'origine d'une condition de concurrence.

L'appel simple d'une méthode dans deux threads différents n'est pas suffisant pour provoquer une condition de concurrence. À moins qu'il y ait une ressource partagée qui pourrait être dans un état incohérent parce qu'un autre thread est en train de l'utiliser, une condition de concurrence n'est pas vraiment un problème.

Si toutes vos variables sont étendues à la méthode, la seule source d'une course que je peux glaner à partir de votre description du problème peut être les appels d'API. S'il est possible que pendant qu'un thread est en train d'accéder à l'API, qu'un autre passe et redémarre l'interaction, ce qui serait problématique, vous pourriez avoir un problème de race.

+0

Oui, je suis particulièrement préoccupé par les appels d'API externes. Donc, fondamentalement, tant qu'il n'y a pas de ressources partagées à un moment donné dans la fonction, alors je devrais être ok ça sonne comme. Merci! – Ruben