multiprocessing unter Windows...

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wollte mir mal das multiprocessing modul ansehen.

Ich nutzte ich SciTE einen einfaches Debugger Skript, siehe: http://www.jensdiemer.de/de/Tipps-und-T ... hon/SciTE/

Das verträgt sich aber nicht mit multiprocessing. Der debugger startet das eigentliche Skript so:

Code: Alles auswählen

def print_exc_plus():
...

if __name__ == '__main__':
    filepath, filename =  os.path.split(sys.argv[1])
    print "Start %r (%r):" % (filename, filepath)

    os.chdir(filepath)
    current_dir = os.getcwd()
    sys.path.insert(0, current_dir)

    locals_globals = {
        '__builtins__': __builtins__,
        '__name__': '__main__',
        '__file__': filename, # skript should see this "own" filename
    }

    try:
        execfile(filename, locals_globals, locals_globals)
    except SystemExit:
        pass
    except:
        print_exc_plus()
und hier ist das Problem: durch execfile() ist __main__ nicht das selbe.


Hab das Beispiel von https://docs.python.org/2/library/multi ... -processes genommen, also:

Code: Alles auswählen

from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()
Kommt dann zu diesem Traceback:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\sync\jens\SciTE_python_debugger.py", line 121, in <module>
    execfile(filename, locals_globals, locals_globals)
  File "multiprocessing_pipes.py", line 13, in <module>
    p.start()
  File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 748, in save_global
    (obj, module, name))
PicklingError: Can't pickle <function f at 0x01E22130>: it's not found as __main__.f

Ideen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Das nicht mit dem Debugger-Skript starten. ;-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:@jens: Das nicht mit dem Debugger-Skript starten. ;-)
Das wäre die schnellste Lösung... Aber der Debugger ist schon sehr hilfreich... (Wolle immer mal schauen, wie man das selbe in Eclipse und PyDev erreichen kann)

btw. ich versuche multiprocessing mal praktisch anzuwenden: https://github.com/jedie/DragonPy/compa ... g...master

Unter Linux klappt es, unter Windows kommt ein sehr langer Traceback der mit PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock endet. Vollständiger Traceback: https://gist.github.com/jedie/5a178fd001c72e217230
(Darunter auch die Ausgaben von meinem Debugger Skript. Dort starte ich es per Hand, ohne execfile().)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:unter Windows kommt ein sehr langer Traceback der mit PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock endet.
Vielleicht das selbe wie: http://bugs.python.org/issue21204

Bei http://comments.gmane.org/gmane.comp.python.bugs/162506 geht es um den selben Fehler unter Windows. Leider ist der Original code weg.

Der Fehler kommt in diesem Fall wohl durch einen Logger Instanz zustande.

Das könnte auch der Fehler bei mir sein.

EDIT: Ja, scheint so, das es bei mir was ähnliches ist: In 'args' sind Objekte die sich nur unter Linux mit pickle serialisieren lassen, unter Windows aber zu einem Fehler führen ;(
Dumm, das der multiprocessing Traceback so lang und unübersichtlich ist :(


EDIT2: So, ich nutzte erstmal auf die schnelle multiprocessing unter linux und die alte subprocess Lösung unter windows: https://github.com/jedie/DragonPy/commi ... abae32d19b
Richtig weiter geht es erst, wenn ich deutlich aufgeräumt habe...

EDIT3: Wenn man mal in der Doku https://docs.python.org/2/library/multiprocessing.html nach Windows sucht, gibt es noch so einiges zu beachten :?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten