Was können Multiprozessing und Dill zusammen tun?
Ich würde gerne die multiprocessing
Bibliothek in Python. Leider multiprocessing
verwendet pickle
das nicht unterstützen Funktionen mit closures, Lambda-Ausdrücke oder Funktionen in __main__
. Alle drei sind mir wichtig
In [1]: import pickle
In [2]: pickle.dumps(lambda x: x)
PicklingError: Can't pickle <function <lambda> at 0x23c0e60>: it's not found as __main__.<lambda>
Glücklicherweise gibt es dill
ein robuster Gurke. Offenbar dill
zaubert auf importieren, um pickle Arbeit
In [3]: import dill
In [4]: pickle.dumps(lambda x: x)
Out[4]: "cdill.dill\n_load_type\np0\n(S'FunctionType'\np1 ...
Dies ist sehr erfreulich, vor allem, weil ich don ' T haben Zugriff auf die multiprocessing-source-code. Leider habe ich noch nicht bekommen können, dieses sehr einfache Beispiel funktioniert
import multiprocessing as mp
import dill
p = mp.Pool(4)
print p.map(lambda x: x**2, range(10))
Warum ist das so? Was bin ich? Was genau sind die Einschränkungen auf der multiprocessing
+dill
Kombination?
Temporären Bearbeiten für J. F Sebastian
mrockli@mrockli-notebook:~/workspace/toolz$ python testmp.py
Temporary Edit for J.F Sebastian
mrockli@mrockli-notebook:~/workspace/toolz$ python testmp.py
Exception in thread Thread-2:
Traceback (most recent call last):
File "/home/mrockli/Software/anaconda/lib/python2.7/threading.py", line 808, in __bootstrap_inner
self.run()
File "/home/mrockli/Software/anaconda/lib/python2.7/threading.py", line 761, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/mrockli/Software/anaconda/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
^C
...lots of junk...
[DEBUG/MainProcess] cleaning up worker 3
[DEBUG/MainProcess] cleaning up worker 2
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-5] child process calling self.run()
[INFO/PoolWorker-6] child process calling self.run()
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-7] child process calling self.run()
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-8] child process calling self.run()Exception in thread Thread-2:
Traceback (most recent call last):
File "/home/mrockli/Software/anaconda/lib/python2.7/threading.py", line 808, in __bootstrap_inner
self.run()
File "/home/mrockli/Software/anaconda/lib/python2.7/threading.py", line 761, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/mrockli/Software/anaconda/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
^C
...lots of junk...
[DEBUG/MainProcess] cleaning up worker 3
[DEBUG/MainProcess] cleaning up worker 2
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-5] child process calling self.run()
[INFO/PoolWorker-6] child process calling self.run()
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-7] child process calling self.run()
[DEBUG/MainProcess] added worker
[INFO/PoolWorker-8] child process calling self.run()
InformationsquelleAutor der Frage MRocklin | 2013-11-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
multiprocessing
macht einige schlechte Entscheidungen zu Beizen. Versteh mich nicht falsch, es macht einige gute Entscheidungen, die es Ihr ermöglichen, Gurke, bestimmte Typen, also Sie können verwendet werden, in einem pool, die map-Funktion. Aber da haben wirdill
tun können die Beizen -, multiprocessing-eigene Beizen wird ein wenig zu begrenzen. Eigentlich, wennmultiprocessing
waren zu verwendenpickle
stattcPickle
... und auch fallen einige von seinen eigenen Beizen überschreibt, danndill
übernehmen könnte und geben einem viel mehr vollständige Serialisierung fürmultiprocessing
.Bis das passiert, gibt es eine Gabel von
multiprocessing
genannt pathos (die release-version ist ein wenig abgestanden, leider) , entfernt die oben genannten Einschränkungen. Pathos fügt auch einige nette features, die multiprocessing nicht, wie multi-args in der map-Funktion. Pathos ist fällig für eine Veröffentlichung, nach einigen milden Aktualisierung-vor allem Umstellung auf python 3.x.und einfach zu zeigen, ein wenig von dem, was
pathos.multiprocessing
tun können...InformationsquelleAutor der Antwort Mike McKerns