Wahres Multithreading mit boost.python

8

Ich versuche eine multi-threaded C ++ DLL zu testen. Diese DLL soll Thread-sicher sein. Ich habe es mit boost.python eingewickelt, und ich möchte mehrere Python-Threads erstellen, um die DLL durch den boost.python-Wrapper auszuüben. Ich versuche tatsächlich , Threading-Probleme zu verursachen.

Was ich keine gute Dokumentation finden kann, ist, ob der Python-Interpreter zwei seiner Threads unterstützt (zum Beispiel auf verschiedenen Kernen), die gleichzeitig ein importiertes Modul aufrufen, und ob die GIL überhaupt etwas zu tun braucht, wenn ich I Ich will keine zusätzliche Sicherheit über das, was die DLL liefern soll.

Kann mir jemand eine Beschreibung von python beschreiben oder verweisen, die DLL-Module von mehreren Threads aufruft und wie die GIL in diesem Fall verwendet wird?

    
jspencer 12.12.2011, 20:23
quelle

2 Antworten

1

Die Antwort ist nein, die GIL wird nie wirklich Multi-Thread, wenn die DLL die Sperre manuell freigibt. Python lässt genau einen Thread gleichzeitig laufen, es sei denn, die Erweiterung sagt manuell: "Ich bin blockiert, mach weiter ohne mich." Dies wird normalerweise mit dem Makro Py_BEGIN_ALLOW_THREADS gemacht (und rückgängig gemacht mit Py_END_ALLOW_THREADS), das in python's include / ceval.h definiert ist. Sobald eine Erweiterung dies tut, lässt Python einen anderen Thread laufen, und der erste Thread, der Python-Kram macht, wird wahrscheinlich Probleme verursachen (wie die Kommentarfrage feststellt.) Es ist wirklich zum Blockieren von I / O oder zu starker Rechenzeit gedacht.

    
jspencer 04.12.2013, 23:42
quelle
4

Wie man GIL beim Aufruf einer C ++ - Funktion von Python über Boost.Pytonon freigibt:

Ссылка

    
lvella 12.12.2011 20:43
quelle