2010-10-15 21 views
1

J'essaie d'utiliser Python dans un module pour un logiciel d'analyse de systèmes de bus de véhicules. Pour cela, je dois intégrer Python de manière sûre, car il peut y avoir plusieurs instances du module qui fonctionnent indépendamment. Je pourrais utiliser un mutex pour garder tous les accès à Python et créer un module unique (python) pour chaque thread. Évidemment, c'est le moyen le plus facile, mais il a aussi le prix de ne pas pouvoir évoluer sur plusieurs cœurs. Ou je pourrais modifier mon module pour engendrer de nouveaux processus dont le stagiaire utilise Python et se connecter à eux via la mémoire partagée. Cela me donne une pénalité de performance et coûte plus de temps à mettre en œuvre, mais évolue très bien.Incorporation de thread sûr Python

Ma question: comment pensez-vous que cela a plus de sens? Y a-t-il un autre moyen d'intégrer le thread Python en toute sécurité ou même d'une manière qui échelonne sur plusieurs cœurs.

Sincères salutations Moritz

edit: J'utilise CPython

+2

Cela dépend de la complexité de ce que vous faites en python, mais dans un scénario général, je dirais que l'utilisation de plusieurs interpréteurs est la bonne solution. Cela améliorerait considérablement la flexibilité et l'évolutivité (pour vous permettre de contourner le GIL en même temps) et vous n'auriez pas besoin de modules par thread. Je pense que le résultat serait beaucoup plus accessible aux autres développeurs sur votre projet et beaucoup plus général. – Olson

+0

Salut Jagerkin si vous postez votre commentaire à nouveau comme réponse je vais probly l'accepter. – JustMaximumPower

+1

@Jagerkin: c'est exactement ce que fait la bibliothèque 'multiprocessing'. La création simultanée de deux interpréteurs Python n'est pas aussi triviale qu'elle le semble au départ, car vous devrez vous préoccuper de la synchronisation processus/thread et de la communication inter-thread/process. La bibliothèque multitraitement fait déjà la plupart du travail pour vous, elle a une version multiprocessus de "File d'attente", "Pipe", "Pool", "valeurs partagées" qui sérialisent et désérialisent de façon transparente les objets sur IPC/mémoire partagée et "Locks" qui se synchronisent sur plusieurs traitements, de sorte que vous n'avez pas à les faire vous-même. –

Répondre

0

Pour donner suite à ma question: je suis allé de l'avant en l'implémentant en utilisant des Processus à usage interne Python. Un bon texte pourquoi la bibliothèque de multitraitement ne fonctionne pas peut être trouvé ici: http://pkaudio.blogspot.com/2010/04/whey-multiprocessing-doesnt-always-work.html Ce n'était pas écrit par moi-même mais ce type a le même problème que j'ai. Je suis reconnaissant pour tout le monde qui a essayé de m'aider.

3

Si vous êtes lié CPU, Python ne peut à l'échelle multi-cœur en utilisant la bibliothèque de multitraitement. Cependant, si vous êtes lié aux E/S, le thread est généralement suffisant.

Si vous souhaitez une sécurité de thread facile, utilisez la file d'attente pour tous les messages transmis.

+0

est-ce que la bibliothèque multi-traitement m'aide vraiment? Je n'utilise pas plusieurs threads au sein d'un interpréteur Python, je souhaite utiliser plusieurs interpréteurs Python exécutés dans plusieurs threads (C++). – JustMaximumPower

+0

La bibliothèque multitraitement peut gérer le sous-processus de génération (c'est-à-dire qu'elle engendre plusieurs interpréteurs python) et la communication interprocessus (par exemple le partage de données, la synchronisation) et évite ainsi le GIL (Global Interpreter Lock). Je suggère de le regarder avant d'essayer de générer plusieurs interpréteurs sur des threads C++ (qui répliqueront la plupart de ce qu'ils font dans la bibliothèque multi-traitement). –

+0

Encore une fois, je ne veux pas de processus sup de Python Je veux, le cas échéant, générer de nouveaux processus à partir de C. Alors suggérez-vous que je me penche sur le code source Multiprocessing? Ou comment la bibliothèque multi-traitement m'aide-t-elle? Je n'essaie pas d'être arrogant, mais je ne vois pas comment votre réponse m'aide. – JustMaximumPower