Warum kann ich eine Instanzmethode an multiprocessing.Process übergeben, aber nicht an multiprocessing.Pool?
Ich versuche, eine Anwendung zu schreiben, die eine Funktion gleichzeitig mit einem @ anwendemultiprocessing.Pool
. Ich möchte, dass diese Funktion eine Instanzmethode ist (damit ich sie in verschiedenen Unterklassen unterschiedlich definieren kann). Dies scheint nicht möglich zu sein; wie ich woanders gelernt habe, anscheinendgebundene Methoden können nicht gebeizt werden. Warum beginnt einmultiprocessing.Process
mit einer gebundenen Methode als Zielarbeit? Der folgende Code:
import multiprocessing
def test1():
print "Hello, world 1"
def increment(x):
return x + 1
class testClass():
def process(self):
process1 = multiprocessing.Process(target=test1)
process1.start()
process1.join()
process2 = multiprocessing.Process(target=self.test2)
process2.start()
process2.join()
def pool(self):
pool = multiprocessing.Pool(1)
for answer in pool.imap(increment, range(10)):
print answer
print
for answer in pool.imap(self.square, range(10)):
print answer
def test2(self):
print "Hello, world 2"
def square(self, x):
return x * x
def main():
c = testClass()
c.process()
c.pool()
if __name__ == "__main__":
main()
Erzeugt diese Ausgabe:
Hello, world 1
Hello, world 2
1
2
3
4
5
6
7
8
9
10
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python27\Lib\threading.py", line 551, in __bootstrap_inner
self.run()
File "C:\Python27\Lib\threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\Python27\Lib\multiprocessing\pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Warum können Prozesse gebundene Methoden verarbeiten, aber keine Pools?