Python 如何在Twisted中对FTP命令进行排队?

Python 如何在Twisted中对FTP命令进行排队?,python,ftp,twisted,ftp-client,Python,Ftp,Twisted,Ftp Client,我正在使用Twisted编写一个FTP客户端,它可以下载很多文件,我正在尝试非常智能地完成这项工作。然而,我一直有一个问题,我会很快下载几个文件(有时每批约20个,有时约250个),然后下载将挂起,最终连接超时,然后下载和挂起重新开始。我使用延迟信号量一次只下载3个文件,但我现在怀疑这可能不是避免限制服务器的正确方法 以下是相关代码: def downloadFiles(self, result, directory): # make download directory if it d

我正在使用Twisted编写一个FTP客户端,它可以下载很多文件,我正在尝试非常智能地完成这项工作。然而,我一直有一个问题,我会很快下载几个文件(有时每批约20个,有时约250个),然后下载将挂起,最终连接超时,然后下载和挂起重新开始。我使用延迟信号量一次只下载3个文件,但我现在怀疑这可能不是避免限制服务器的正确方法

以下是相关代码:

def downloadFiles(self, result, directory):
    # make download directory if it doesn't already exist
    if not os.path.exists(directory['filename']):
        os.makedirs(directory['filename'])

    log.msg("Downloading files in %r..." % directory['filename'])

    files = filterFiles(None, self.fileListProtocol)
    # from http://stackoverflow.com/questions/2861858/queue-remote-calls-to-a-python-twisted-perspective-broker/2862440#2862440
    # use a DeferredSemaphore to limit the number of files downloaded simultaneously from the directory to 3
    sem = DeferredSemaphore(3)
    jobs = [sem.run(self.downloadFile, f, directory) for f in files]
    d = gatherResults(jobs)
    return d

def downloadFile(self, f, directory):
    filename = os.path.join(directory['filename'], f['filename']).encode('ascii')
    log.msg('Downloading %r...' % filename)
    d = self.ftpClient.retrieveFile(filename, FTPFile(filename))
    return d
您会注意到,我正在重用FTP连接(顺便说一下,是活动的),并使用自己的FTPFile实例来确保在文件下载连接“丢失”(即完成)时关闭本地文件对象。我想知道我是否应该直接使用。老实说,我在执行“到达”和“超出”命令后迷路了,所以可能它已经被使用了


有什么建议吗?谢谢

我建议使用queueCommand,正如您所建议的,我怀疑您使用的信号量可能导致您出现问题。我相信使用queueCommand会将您的FTPClient限制为单个活动连接(尽管我只是猜测),因此如果您想快速完成操作,您可能需要考虑创建几个FTPClient实例并将下载作业传递给它们。如果使用,则会得到一个Deferred,您可以使用它来确定每个客户机的当前位置,甚至可以在回调中将另一个作业添加到该客户机的队列中