Multiprocessing auf Windows bricht
Entwickle ich mit Python auf Linux und habe es nie wirklich gesehen, diese Art von problem mit Windows. Ich bin mit der multiprocessing
Bibliothek zu beschleunigen von Berechnungen, die sehr gut funktioniert für mich auf Linux.
Unter Windows, aber die Dinge laufen nicht so reibungslos:
* [INFO] Parsing 1 file using 2 threads
Traceback (most recent call last):
File "main.py", line 170, in <module>
master = ParsingMaster(parser, list(input_file), output_list, threads=num_threads)
Traceback (most recent call last):
File "main.py", line 39, in __init__
File "<string>", line 1, in <module>
self.input_process.start()
File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
self._popen = Popen(self)
self = load(from_parent)
File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
File "C:\Python26\lib\pickle.py", line 1370, in load
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Python26\lib\pickle.py", line 224, in dump
return Unpickler(file).load()
self.save(obj)
File "C:\Python26\lib\pickle.py", line 858, in load
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 419, in save_reduce
dispatch[key](self)
File "C:\Python26\lib\pickle.py", line 880, in load_eof
save(state)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
r aise EOFError
File "C:\Python26\lib\pickle.py", line 649, in save_dict
EOFError
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\multiprocessing\forking.py", line 40, in dispatcher
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 401, in save_reduce
save(args)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 548, in save_tuple
save(element)
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 306, in save
rv = reduce(self.proto)
File "C:\Python26\lib\multiprocessing\managers.py", line 458, in __reduce__
return type(self).from_address, \
AttributeError: type object 'SyncManager' has no attribute 'from_address'
Ich Teste auf beiden Python 2.6 und 2.7 auf Windows 7 und bekomme die gleiche Fehlermeldung immer und immer wieder. Weiß jemand was es bedeutet?
- Hast du gelesen Plattform-spezifische Dokumentation, vor allem die erste Einschränkung?
- Danke, ich habe gerade. Ich bin nur mit Listen als Argumente für die ganze Klasse, so sollte es keine Beizen Fehler. Ich bin nicht Unterklassen Prozess entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es Einschränkungen bei Windows, hier ist der relevante Teil der Fehler, die Sie sehen:
Da Windows-os fehlt.fork() hat es ein paar Einschränkungen:
Mehr picklability
Dies bedeutet, dass etwas, das als argument übergeben
Process.__init__()
ist nicht in der Lage zu sein, gebeizt oder unpickled ( a Serialisierung in Python ). Was istSyncManager
es ist beschweren sich über nicht in der Lage zu finden, die Attribute auf das ObjektAttributeError: type object 'SyncManager' has no attribute 'from_address'
ist es vermutlich Ihre Ursache. Können, dassSyncManager
Objekt tatsächlich werden gebeizt, ist es gerecht die Gurke Regeln?Wenn Sie mit dieser von der Kommandozeile unter Windows, das kannst du nicht tun entweder offenbar.
Nicht. Speichern Sie den code in eine Datei und führen Sie es aus der Datei statt, mit dem Befehl:
Dass löst Ihr Problem.
Process
entweder.SyncManager
ich nie definiert. Es ist ein Teil vonmultiprocessing
soweit ich das sagen kann.python abc.py
in der Kommandozeile funktioniert Prima.C:\Python26\python.exe script.py
.