Obwohl ich den Antworten von Reed Copsey und Alex Martelli zustimme, möchte ich auf einen weiteren Unterschied hinweisen - das Global Interpreter Lock (GIL). Während IronPython nicht die Einschränkungen der GIL aufweist, hat CPython dies - so scheint es, dass IronPython für Anwendungen, bei denen die GIL ein Engpass ist, beispielsweise in bestimmten Multicore-Szenarien, einen Vorteil gegenüber Python.NET hat.
Aus der Python.NET-Dokumentation:
Wichtiger Hinweis für Einbettungsprogramme: Python ist kein Thread-Thread und verwendet eine globale Interpretersperre, damit Multithread-Anwendungen sicher mit dem Python-Interpreter interagieren können. Weitere Informationen hierzu finden Sie in der Python C-API-Dokumentation auf der
www.python.org
Website.
Wenn Sie Python in eine verwaltete Anwendung einbetten, müssen Sie die GIL genauso verwalten wie beim Einbetten von Python in eine C- oder C ++ - Anwendung.
Vor der Interaktion mit einem der vom Python.Runtime
Namespace bereitgestellten Objekte oder APIs
muss der aufrufende Code die globale Python-Interpretersperre durch Aufrufen der
PythonEngine.AcquireLock
Methode erhalten haben. Die einzige Ausnahme von dieser Regel ist die
PythonEngine.Initialize
Methode, die beim Start aufgerufen werden kann, ohne die GIL erworben zu haben.
Wenn Sie die Python-APIs nicht mehr verwenden, muss der verwaltete Code einen entsprechenden Code aufrufen
PythonEngine.ReleaseLock
, um die GIL freizugeben und anderen Threads die Verwendung von Python zu ermöglichen.
Die AcquireLock
und ReleaseLock
-Methoden sind Thin Wrapper über die nicht verwalteten PyGILState_Ensure
und
PyGILState_Release
Funktionen der Python-API, und die Dokumentation für diese APIs gilt für die verwalteten Versionen.
Ein weiteres Problem ist die IDE-Unterstützung. CPython hat derzeit wahrscheinlich eine bessere IDE-Unterstützung als IronPython - daher kann dies ein Faktor bei der Auswahl eines über dem anderen sein.