在
http.client.HTTPResponse你回来-object
urlopen()有一个
_io.BufferedReader附加-
object,这个对象不能腌制。
pickle.dumps(urllib.request.urlopen('http://www.python.org').fp)Traceback (most recent call last):... pickle.dumps(urllib.request.urlopen('http://www.python.org').fp)TypeError: cannot serialize '_io.BufferedReader' objectmultiprocessing.Pool将需要对结果进行腌制(序列化)以将其发送回父进程,这在这里失败。由于
dummy使用线程而不是进程,因此不会出现酸洗,因为同一进程中的线程自然会共享其内存。
一个通用的解决方案
TypeError是:
- 读出缓冲区并保存内容(如果需要)
'_io.BufferedReader'
从您要腌制的对象中删除对的引用
在你的情况,要求
.read()在
http.client.HTTPResponse将清空并删除缓存,所以功能的响应转换成一些与pickle可以简单地这样做:
def read_buffer(response): response.text = response.read() return response
例:
r = urllib.request.urlopen('http://www.python.org')r = read_buffer(r)pickle.dumps(r)# Out: b'x80x03chttp.clientnHTTPResponse...在考虑使用这种方法之前,请确保您确实要使用多处理而不是多线程。对于像这里这样的受I /
O约束的任务,多线程就足够了,因为无论如何大多数时间都花在等待响应上(不需要cpu时间)。涉及到的多处理和IPC也引入了大量的开销。



