如何保持FTP连接处于活动状态?

2024-04-25 20:00:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用ftputil从FTP服务器下载了一批文件。它引发了错误ftputil.error.FTPIOError: [Errno 60] Operation timed out

Documentation – ftputil所述

keep_alive() attempts to keep the connection to the remote server active in order to prevent timeouts from happening. This method is primarily intended to keep the underlying FTP connection of an FTPHost object alive while a file is uploaded or downloaded. This will require either an extra thread while the upload or download is in progress or calling keep_alive from a callback function.

我使用callback函数调用了keep_alive

ftp_host.download(source, target, callback=ftp_host.keep_alive) 

但它提高了ERROR __main__ keep_alive() takes 1 positional argument but 2 were given

如何保持FTP连接处于活动状态


Tags: orthetoinfromaniscallback
1条回答
网友
1楼 · 发布于 2024-04-25 20:00:00

这不是对你问题的直接回答,但它可能有助于你自己为你的特定问题找到答案。此外,ftputil网站上的ticket可以更好地帮助调试问题。也就是说,我认为可以先询问StackOverflow,因为您事先不知道问题是否简单。:-)

由于FTP是一种有状态协议,客户端和服务器不能在给定时间发送任意命令。允许的命令和可能的回复由连接所处的状态决定。另请参见RFC 959中的状态图

为了克服这个限制,ftputil在后台为每个远程文件对象创建一个新的FTP连接[1]。使用这种方法,您仍然可以发送chdir之类的命令,或者在另一个命令仍在进行时开始下载。但是,这意味着从服务器的角度来看,来自单个FTPHost对象的所有这些FTP连接都是独立的连接,因此每个连接都可以在不同的时间超时,具体取决于各自连接的使用模式

例如,有ftputil ticket 141,其中FTPHost对象启动的主连接可能在用于下载的连接仍然可用时超时

在您的情况下,找出哪一个底层连接超时(初始连接或远程文件的连接)可能会有所帮助。您可以使用ftputil.session.session_factory创建启用FTP调试的工厂(请参见documentation

不幸的是,60秒的超时时间很短,因此超时的机会相对较多

特别是考虑到FTP连接中可能出现超时,我的建议是编写FTP传输软件,以便可以在超时中断的情况下重新启动操作(最好使用新的FTPHost对象以增强健壮性)。到目前为止,我还没能想出一个方法来普遍解决超时问题。在简单的情况下,直接使用ftplib实际上可能会比使用ftplib更好,尽管ftputil具有ftplib所没有的健壮性和延迟改进。使用ftplib不会使您免于超时,但至少您没有任何可能使调试更加困难的“隐藏”连接


[1]也就是说,如果关闭ftputil中的远程文件,则可以重用底层FTP连接,除非它没有超时。库在重新使用连接之前检查超时

通过ftputil缓存来自服务器的大量信息以减少延迟,有关超时的情况更加复杂。例如,如果调用FTPHost.getcwd(),则当前目录将从缓存的属性中检索,而不是通过向服务器发送PWD命令,从而重置超时。目录列表中的统计信息通常也会被缓存

相关问题 更多 >