gpt4 book ai didi

python - multiprocessing.pool.MaybeEncodingError : 'TypeError("cannot serialize '_io.BufferedReader' object", )'

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:07 40 4
gpt4 key购买 nike

为什么下面的代码只适用于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")'

缺少什么才能在没有“虚拟”的情况下工作?

最佳答案

urlopen() 返回的 http.client.HTTPResponse 对象附加了一个 _io.BufferedReader 对象,而这个对象不能被腌制。

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 需要对结果进行 pickle(序列化)以将其发送回父进程,但此处失败。由于 dummy 使用线程而不是进程,因此不会进行酸洗,因为同一进程中的线程自然共享内存。

TypeError 的一般解决方案是:

  1. 读出缓冲区并保存内容(如果需要)
  2. 从您尝试 pickle 的对象中删除对 '_io.BufferedReader' 的引用

在您的情况下,在 http.client.HTTPResponse 上调用 .read() 将清空并删除缓冲区,因此将响应转换为可腌制的内容的函数可以简单地这样做:

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 绑定(bind)任务,多线程就足够了,因为大部分时间都花在等待(不需要 cpu 时间)响应上。涉及的多处理和 IPC 也会引入大量开销。

关于python - multiprocessing.pool.MaybeEncodingError : 'TypeError("cannot serialize '_io.BufferedReader' object", )',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736710/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com