Multiprocessing und der Pickle-Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlackJack

@pyme: In dem Shared Memory würdest Du ja nur die `ctypes`-Objekte ablegen, die als Proxy für die DLL dienen. Aber nicht die DLL selber. Die `ctypes`-Objekte enthalten Zeiger auf die Funktionen in der DLL. Diese Zeiger gelten aber nur für den Prozess in dem sie erstellt wurden. Du kannst den Zeiger zwar im Shared Memory ablegen, und ein anderer Prozess kann auf den Zeiger auch zugreifen, aber die Speicheradresse auf die er zeigt, kann in dem anderen Prozess eine völlig andere Bedeutung haben. Über Shared Memory kann man nur die Daten teilen, die auch tatsächlich innerhalb des Shared Memory liegen.

Das Objekt, das von `Process` erbt muss (zumindest unter Windows) komplett serialisierbar sein, weil das an den neu gestarteten Prozess übertragen wird. Und Zeiger, die auf etwas im Adressraum eines Prozesses zeigen, sind nicht serialisierbar, weil die Adresse auf die sie zeigen, nur innerhalb des laufenden Prozesses sinnvoll sind.

Prozesse haben, im Gegensatz zu Threads, jeweils einen eigenen Adressraum. Alle Exemplare von Python-Objekten in Prozessen sind neu erstellt und damit unterschiedlich. Das gilt selbst für die Shared Memory Objekte. Denn die *Python*-Objekte liegen alle im Adressraum des Prozesses und enthalten nur Zeiger auf Daten im Shared Memory.
pyme
User
Beiträge: 7
Registriert: Dienstag 13. September 2011, 12:52

Ich danke euch vielmals. Ich habe das Problem jetzt bewältigen können :-) es war tatsächlich dieses dämliche ctypes Objekt. Ich hatte leider die ganze Zeit einen Denkfehler. Ich dachte der Prozess wird bereits zu Beginn mit der Initialisierung der ProcessKlasse erzeugt. Da ich das ctypes Objekt in __init__ erzeugt habe, bin ich davon ausgegangen es wird bereits im neuen Prozess erzeugt. Jetzt hab ich den ctypes Aufruf in der run Methode und schon klappt alles :-)

Danke nochmal!
Antworten