http.client.HTTPResponse
-объект, который вы получаете от urlopen()
, имеет прикрепленный _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
нужно будет выбрать (сериализовать) результаты, чтобы отправить их обратно в родительский процесс, и здесь это не получается.Так как dummy
использует потоки вместо процессов, процесс сортировки не будет выполняться, поскольку потоки в одном и том же процессе естественным образом совместно используют свою память.
Общее решение для этого TypeError
:
- считывание буфера и сохранение содержимого (при необходимости)
- удаление ссылки на
'_io.BufferedReader'
из объекта, который вы пытаетесь выделить
В вашем случае вызов .read()
на http.client.HTTPResponse
очистит и удалит буфер, поэтому функция преобразования ответа в что-то, что можно перехватить, может просто сделать это:
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\...
ДоВы рассматриваете этот подход, убедитесь, что вы действительно хотите использовать многопроцессорность вместо многопоточности.Для задач, связанных с вводом / выводом, как у вас здесь, многопоточность была бы достаточной, так как большую часть времени тратится на ожидание (в любом случае, времени процессора) ответа.Многопроцессорная обработка и задействованный IPC также вносят существенные накладные расходы.