0

FTPサーバーから接続してファイルリストを取得するためにftplibを使用しています。私が抱えている問題は、接続が時々ハングすることであり、その理由はわかりません。スレッドを使用して、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 接続が時々ハングするのはなぜですか? また、これを監視するにはどうすればよいですか? そのため、何らかの方法でスレッドを終了し、新しいスレッドを開始したいと考えています。

ありがとう

4

1 に答える 1

1

堅牢性のために構築している場合は、イベント駆動型の方法を検討することを強くお勧めします。FTP をサポートしているものの 1 つはTwisted ( API ) です。

利点は、I/O の待機中にスレッドをブロックしないことと、必要に応じて接続を監視する単純なタイマー関数を作成できることです。また、スケーリングも大幅に向上します。イベント駆動型パターンを使用してコーディングするのは少し複雑なので、これが単純なスクリプトである場合は、余分な労力を費やす価値がある場合とそうでない場合がありますが、デーモンを作成していると書いているので、調べる価値があるかもしれません。

以下は FTP クライアントの例です: ftpclient.py

于 2012-10-16T09:52:03.707 に答える