Pourquoi est-ce le code ci-dessous exécution lors de l'utilisation threads
mais jeter une exception lorsque multiprocessing
est utilisé?Pourquoi multiprocessing.pool.map déclenche un PicklingError (Encoding)?
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadsPool
import urllib2
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.python.org/doc/',
'http://www.python.org/download/']
def use_threads():
pool = ThreadsPool(4)
results = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()
print [len(x.read()) for x in results]
def use_procs():
p_pool = Pool(4)
p_results = p_pool.map(urllib2.urlopen, urls)
p_pool.close()
p_pool.join()
print 'using procs instead of threads'
print [len(x.read()) for x in p_results]
if __name__ == '__main__':
use_procs()
L'exception est
Traceback (most recent call last):
File "pools.py", line 39, in <module>
use_procs()
File "pools.py", line 31, in use_procs
p_results = p_pool.map(urllib2.urlopen, urls)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[<addinfourl at 35286624 whose fp = <socket._fileobject object at 0x2198ad0>>]'. Reason: 'PicklingError("Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed",)'
Je sais qu'il ya une différence entre la façon dont les processus et les fils communiquent entre eux. Pourquoi pickle
échoue sur le contenu du site Web? Comment puis-je définir l'encodage pour résoudre ce problème?
Cette erreur a soulevé parce que vous essayez de sérialisation objet socket, ce qui est impossible –
avoir une idée quelle fonction dois-je passer à la carte pour obtenir la sortie désirée? (Lire l'exécution sur l'objet) – Vinny