J'ai un programme python3 à un seul thread que j'essaie de convertir pour utiliser plusieurs threads. J'ai une structure de données en forme d'arbre qui est lue et écrite. Potentiellement, plusieurs threads voudront lire et écrire en même temps.
Une façon évidente d'y parvenir est d'avoir un seul verrou pour l'ensemble de la structure de données : personne ne peut lire pendant qu'une écriture est en cours, il ne peut y avoir plus d'une écriture à la fois, et aucune écriture ne peut avoir lieu lorsqu'il y a des lectures en attente.
Cependant, j'aimerais que le verrouillage soit plus fin pour améliorer les performances. Il s'agit d'un arbre complet à 16 branches qui, lorsqu'il est entièrement peuplé, compte environ 5 à 6 millions de feuilles (ce qui est généralement bien équilibré dans la pratique, mais rien n'est garanti). Si je voulais le verrouillage le plus fin, je pourrais verrouiller les parents des feuilles. Cela représenterait plus de 100 000 verrous.
Je dois admettre que je ne l'ai pas encore essayé. Mais j'ai pensé poser la question suivante : y a-t-il des limitations matérielles ou des raisons de performance qui devraient m'empêcher de créer autant d'objets de verrouillage ? En d'autres termes, devrais-je envisager de verrouiller jusqu'à, disons, la profondeur 2 à partir de la racine (256 verrous) ?
Merci pour vos conseils.
EDIT :
Plus d'informations :
Je ne connais pas encore le nombre de cœurs, car nous sommes encore en train d'expérimenter la puissance de calcul dont nous aurons besoin, mais je me risquerais à dire qu'une poignée de cœurs seulement sera utilisée.
Je vise environ 50 000 fils. Il y a des E/S asynchrones et un thread par socket. Pendant la phase d'amorçage du code, autant de threads que possible seront exécutés simultanément (dans la limite du matériel), mais c'est un coût unique. Ce qui nous intéresse le plus, c'est ce qui se passe une fois que les choses sont en place et fonctionnent. À ce stade, je dirais que seuls quelques milliers de threads par seconde sont en cours d'exécution. Je dois mesurer le temps de réponse, mais je pense qu'il est d'environ 10 ms par période de veille. Cela représente quelques dizaines de threads actifs à la fois (en moyenne).
Maintenant que je l'ai écrit, c'est peut-être la réponse à ma question. Si je n'ai besoin que de quelques dizaines de threads qui lisent ou écrivent à la fois, alors je n'ai pas vraiment besoin d'un verrouillage aussi fin sur l'arbre.