该线程使用FTP LIST与Python挂起

时间:2012-10-16 09:14:43

标签: python ftp

我使用ftplib连接并从FTP服务器获取文件列表。 我遇到的问题是连接时常挂起,我不知道为什么。我使用线程将python脚本作为守护进程运行。 看看我的意思:

def main():
signal.signal(signal.SIGINT, signal_handler)

    app.db = MySQLWrapper()
    try:
        app.opener = FTP_Opener()
        mainloop = MainLoop()

        while not app.terminate:
            # suspend main thread until the queue terminates
            # this lets to restart the queue automatically in case of unexpected shutdown
            mainloop.join(10)
            while (not app.terminate) and (not mainloop.isAlive()):
                time.sleep(script_timeout)
                print time.ctime(), "main: trying to restart the queue"
                try:
                    mainloop = MainLoop()
                except Exception:
                    time.sleep(60)

    finally:
        app.db.close()
        app.db = None
        app.opener = None
        mainloop = None
        try:
            os.unlink(PIDFILE)
        except:
            pass
        # give other threads time to terminate
        time.sleep(1)
        print time.ctime(), "main: main thread terminated"

MainLoop()具有FTP连接,下载特定文件和与服务器断开连接的功能。

以下是我如何获取文件的列表:

file_list = app.opener.load_list()

FTP_Opener.load_list()函数如何显示:

def load_list(self):
    attempts = 0
    while attempts<=ftp_config.load_max_attempts:
        attempts += 1
        filelist = []
        try:
            self._connect()
            self._chdir()
            # retrieve file list to 'filelist' var
            self.FTP.retrlines('LIST', lambda s: filelist.append(s))

            filelist = self._filter_filelist(self._parse_filelist(filelist))

            return filelist
        except Exception:
            print sys.exc_info()
            self._disconnect()
            sleep(0.1)

    print time.ctime(), "FTP Opener: can't load file list"
    return []

为什么有时FTP连接会挂起,我该如何监控?所以,如果它发生了,我想以某种方式终止该线程并开始一个新的。

由于

1 个答案:

答案 0 :(得分:1)

如果您正在构建健壮性,我强烈建议您考虑使用事件驱动的方法。其中一个具有FTP支持的是TwistedAPI)。

优点是您在等待I / O时不会阻塞线程,如果您愿意,可以创建简单的计时器功能来监视您的连接。它也可以更好地扩展。使用事件驱动模式进行编码稍微复杂一些,所以如果这只是一个简单的脚本,它可能或者可能不值得付出额外的努力,但是既然你写的是你正在编写一个守护进程,那么它可能值得研究。

以下是FTP客户端的示例:ftpclient.py