Por que posso passar um método de instância para multiprocessing.Process, mas não para multiprocessing.Pool?
Estou tentando escrever um aplicativo que aplique uma função simultaneamente a ummultiprocessing.Pool
. Gostaria que essa função fosse um método de instância (para que eu possa defini-la de maneira diferente em diferentes subclasses). Isso não parece ser possível; como aprendi em outro lugar, aparentementemétodos vinculados não podem ser mantidos em conserva. Então, por que iniciar ummultiprocessing.Process
com um método vinculado como um trabalho de destino? O código a seguir:
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()
Produz esta saída:
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 que os Processos podem lidar com métodos vinculados, mas não Pools?