【问题标题】:How do I keep a FTP connection alive?如何保持 FTP 连接处于活动状态?
【发布时间】:2021-04-28 13:09:28
【问题描述】:

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

Documentation – ftputil中所述,

keep_alive() 尝试保持与远程服务器的连接处于活动状态,以防止发生超时。此方法主要用于在上传或下载文件时保持 FTPHost 对象的底层 FTP 连接处于活动状态。 这将需要在上传或下载过程中使用额外线程,或者从 callback 函数调用 keep_alive

我使用 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 连接有效?

【问题讨论】:

  • 您可能需要将 ftp_host.keep_alive 包装在一个仅使用一个参数调用它的 lambda 中
  • 另一条评论说的是,当您将函数传递给ftp_host.download 的回调时,它会使用chunks 参数调用,但ftp_host.keep_alive 函数不接受任何参数,所以一种方法是callback=lambda chunks:ftp_host.keep_alive。来自文档“如果给定,将为每个传输的数据块调用回调:callback(chunk)
  • @python_user 哎呀,它引发了ftplib.error_temp: 421 No transfer timeout (60 seconds): closing control connection
  • 遗憾的是我没有想法,我之前没有使用过这个库

标签: python ftp ftputil


【解决方案1】:

这不是您问题的直接答案,但可能有助于您自己找到特定问题的答案。此外,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,尽管 ftputil 具有ftplib 所没有的健壮性和延迟改进。使用ftplib 并不能让您免于超时,但至少您没有任何可能使调试更加困难的“隐藏”连接。


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2021-09-13
    • 2013-08-27
    • 2019-09-01
    • 2013-03-20
    相关资源
    最近更新 更多