我正在使用Python的多处理来使用FTP进行批量下载。但是,当我尝试打开超过5个ftp的会话时,会引发EOFError,这意味着主机正在断开连接以打开太多会话。
我看到的唯一解决方案是打开一个FTP对象并将其传递给必要的方法。问题是因为多处理使用酸洗来移动对象,并且FTP对象无法被腌制,所以这是不可能的。因此,我的问题是,是否有可能通过找到一种方法来解决FTP对象?
我的代码格式如下:
def get_file(name):
#code here
def worker(name_list, out_q):
lst = []
for name in name_list:
lst.append(get_file(name))
out_q.put(lst)
if __name__ == '__main__':
#est ftp cnxn
ftp = FTP('ftp.blah.blah', 'anonymous', 'meow')
#multiprocessing code here
get_file def需要访问ftp连接,如果我把它放在if __name__ == '__main__'
块之外,那么每次进程运行代码时都会创建一个新的ftp连接。
答案 0 :(得分:2)
您可以通过创建包装FTP对象的pickleable类来解决此问题。基本上你绑定了包装器类中的FTP构造函数参数,然后一旦在远程主机上反序列化,就会在那里实例化FTP对象。
答案 1 :(得分:2)
我真的不明白你为什么要那样做:
这究竟是如何解决您的问题的?
但是,不是序列化FTP对象,而是为FTP请求创建一个流程,并设计一个迷你语言来与该流程进行通信 - 让您的其他流程发送(容易发送)形式get src dst
的消息。 / p>
编辑:刚查看了[ftplib][1]
的文档。没有任何地方说它可以处理多个电话。假设它没有!
所以,我会这样做:
MAX_CONNECTIONS
(例如5)FTP工作进程