为什么下面的代码只适用于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
是:
'_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。下面我粘贴了我的一些代码。 这是我的资源: