Ответ 1
Обновление, 9 мая 2014 года:
Я определил точное ограничение. Можно отправлять объекты через границы процесса рабочим процессам, пока объекты могут быть маринованными Python pickle facility. Проблема, которую я описал в моем первоначальном ответе, возникла из-за того, что я пытался отправить дескриптор файла рабочим. Быстрый эксперимент показывает, почему это не работает:
>>> f = open("/dev/null")
>>> import pickle
>>> pickle.dumps(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.7/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle file objects
Таким образом, если вы столкнулись с ошибкой Python, которая заставила вас найти этот вопрос, убедитесь, что все вещи, которые вы отправляете через границы процесса, можно мариновать.
Оригинальный ответ:
Я немного опоздал, чтобы ответить. Тем не менее, я столкнулся с тем же сообщением об ошибке, что и исходный плакат, пытаясь использовать модуль многопроцессорности Python. Я запишу свои выводы, чтобы кто-нибудь, кто наткнулся на эту тему, попытался попробовать.
В моем случае ошибка произошла из-за того, что я пытался отправить в пул работников: я пытался передать массив файловых объектов для работников пула, чтобы пережевывать. Это, видимо, слишком много для отправки через границы процесса в Python. Я решил проблему, отправив словари пула работников, которые указали строки ввода и вывода имени файла.
Таким образом, кажется, что итерабельность, которую вы передаете функции, такой как apply_async
(я использовал map()
и imap_unordered()
), может содержать список чисел или строк или даже подробную структуру данных словаря (как долго поскольку значения не являются объектами).
В вашем случае:
pool.apply_async(downloadFile, (filename,local_filename,ftp))
ftp
- это объект, который может вызвать проблему. В качестве обходного пути я бы рекомендовал отправить параметры рабочему (в этом случае выглядит как host
и path
), и пусть работник создает экземпляр объекта и обрабатывает очистку.