¿Por qué puedo pasar un método de instancia a multiprocessing.Process, pero no a multiprocessing.Pool?
Estoy tratando de escribir una aplicación que aplique una función simultáneamente con unmultiprocessing.Pool
. Me gustaría que esta función sea un método de instancia (para poder definirla de manera diferente en diferentes subclases). Esto no parece ser posible; como he aprendido en otra parte, aparentementelos métodos enlazados no se pueden encurtir. Entonces, ¿por qué comenzar unmultiprocessing.Process
con un método enlazado como un trabajo objetivo? El siguiente código:
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()
Produce esta salida:
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
¿Por qué los procesos pueden manejar métodos enlazados, pero no agrupaciones?