2010-06-03 8 views
19

Incorporation de l'interpréteur Python dans un C/C++ application is well documented. Quelle est la meilleure approche pour exécuter plusieurs interpréteurs python sur plusieurs threads de système d'exploitation (c'est-à-dire un interpréteur sur un thread de système d'exploitation dans le même processus) qui sont invoqués à partir de l'application C/C++? Ces applications peuvent également avoir des problèmes liés à la fragmentation de la mémoire et limitations of Py_Finalize().Plusieurs interpréteurs Python intégrés indépendants sur plusieurs threads du système d'exploitation invoqués à partir du programme C/C++

Une telle approche peut être la suivante:

  1. fil Python et donc GIL désactivé dans pyconfig.h de rester simple (#undef WITH_THREAD)
  2. Toutes les variables globales mutables du code source interpréteur Python déplacé à la structure allouée par tas référencée via Thread Local Storage (Référence: Python on a Phone).

Mes questions sont les suivantes:

  1. Y at-il une meilleure approche?
  2. Existe-t-il des outils permettant d'automatiser la conversion des variables globales du code source de l'interpréteur Python en structure allouée par tas référencée via TLS (Thread Local Storage)?

Sujets similaires sont discutés ici:

+5

L'ensemble des problèmes pour lesquels la solution optimale est constituée de plusieurs interpacteurs python intégrés est infiniment petit.Avant de dépenser trop d'efforts dans cette voie, je serais terriblement certain qu'une solution multi-processus et de transmission de messages est impraticable. – Rakis

+0

Quand vous dites "OS", vous voulez probablement dire "processus"? Si c'est le cas, le shell '&' fait presque tout ce que vous voulez. Les systèmes d'exploitation fonctionnent généralement au niveau du processus. Si vous voulez dire "processus", veuillez corriger votre question. Si vous pensez vraiment que vous voulez dire "thread", veuillez clarifier pourquoi vous pensez que les threads OS sont si importants. –

Répondre

3

Ce n'est pas exactement une réponse à votre question, mais vous pouvez utiliser des processus distincts au lieu de threads, alors les problèmes devraient disparaître.

Plus:

  • Pas besoin de piratage python (et en vous assurant le résultat fonctionne dans tous les cas prévus)
  • Probablement moins d'effort de développement global
  • mise à niveau facile vers les nouvelles versions de python
  • Interfaces clairement définies entre les différents processus, donc plus facile à obtenir et déboguer

Co ns:

Si vous utilisez la mémoire partagée pour IPC, votre code d'application résultant ne devrait pas différer trop de ce que vous obtiendriez avec des fils. Étant donné que certaines personnes soutiennent que vous devriez toujours use processes over threads, je considérerais au moins cela comme une alternative si cela correspond à vos contraintes de quelque façon que ce soit.