【发布时间】:2017-10-14 17:04:37
【问题描述】:
为什么下面的代码在使用threads时运行,但在使用multiprocessing时抛出异常?
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()
例外是
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",)'
我知道进程和线程之间的通信方式是不同的。为什么pickle 在网站内容上失败?如何设置编码来解决这个问题?
【问题讨论】:
-
由于您尝试序列化套接字对象而引发的错误,这是不可能的
-
知道我应该将什么函数传递给 map 以获得所需的输出? (在对象上读取执行)
标签: python multithreading python-2.7 multiprocessing