当前位置: 首页 > 面试题库 >

multiprocessing.pool.MaybeEncodingError:'TypeError(“无法序列化'_io.BufferedReader'对象”,)'

柳修为
2023-03-14
问题内容

为什么下面的代码只适用于multiprocessing.dummy而不是简单的multiprocessing

import urllib.request
#from multiprocessing.dummy import Pool #this works
from multiprocessing import Pool

urls = ['http://www.python.org', 'http://www.yahoo.com','http://www.scala.org', 'http://www.google.com']

if __name__ == '__main__':
    with Pool(5) as p:
        results = p.map(urllib.request.urlopen, urls)

错误:

Traceback (most recent call last):
  File "urlthreads.py", line 31, in <module>
    results = p.map(urllib.request.urlopen, urls)
  File "C:\Users\patri\Anaconda3\lib\multiprocessing\pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "C:\Users\patri\Anaconda3\lib\multiprocessing\pool.py", line 657, in get
    raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[<http.client.HTTPResponse object at 0x0000016AEF204198>]'. Reason: 'TypeError("cannot serialize '_io.BufferedReader' object")'

缺少什么以便它可以在没有“虚拟”的情况下工作?


问题答案:

http.client.HTTPResponse你回来-objecturlopen()有一个_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' object

multiprocessing.Pool将需要对结果进行腌制(序列化)以将其发送回父进程,这在这里失败。由于dummy使用线程而不是进程,因此不会出现酸洗,因为同一进程中的线程自然会共享其内存。

一个通用的解决方案TypeError是:

  1. 读出缓冲区并保存内容(如果需要)
  2. '_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'\x80\x03chttp.client\nHTTPResponse\...

在考虑使用这种方法之前,请确保您确实要使用多处理而不是多线程。对于像这里这样的受I /
O约束的任务,多线程就足够了,因为无论如何大多数时间都花在等待响应上(不需要cpu时间)。涉及到的多处理和IPC也引入了大量的开销。



 类似资料:
  • (数据类)实体。JAVA (数据类)实体。JAVA 我试着说: 我犯了一个错误: 我已经把和我错过了什么?

  • 问题内容: 使用取消序列化对象时出现以下错误: JSONMappingException无法构造org.springframework.data.Page的实例,问题:抽象类型只能用其他类型信息实例化。 我正在尝试将JSON字符串序列化为表示类型页面的Spring数据对象T。 该User班是一个简单的与和名称。我要反序列化的字符串是: 这将导致异常: 由于是对象,因此无法修改它,我认为这与我在别处

  • 问题内容: 我有一个Java类,它是DynamoDB中表的数据模型。我想使用Dynamo 的to 和item。班上一名成员是一名。因此,我使用来对该字段进行序列化和反序列化。 该列表可以通过成功地序列化。但是,当我尝试取回条目并阅读列表时,它会引发异常:。好像将数据反序列化为而不是。我如何摆脱这个问题? MCVE: 问题答案: 问题的一部分是整个DynamoDB Mapper SDK如何处理泛型。

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 问题内容: 我从服务器收到以下错误响应。 HTTP状态500- 类型例外报告 信息 描述服务器遇到内部错误(),导致服务器无法满足此请求。 例外 javax.servlet.ServletException:java.lang.UnsupportedOperationException:尝试序列化java.lang.Class:org.hibernate.proxy.HibernateProxy。

  • 我从服务器得到以下错误响应。 HTTP状态500- 类型异常报告 来自Java调试器: 我正在使用Gson将我的Java对象转换为JSON。下面我粘贴了我的一些代码。 这是我的资源: