我使用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连接会挂起,我该如何监控?所以,如果它发生了,我想以某种方式终止该线程并开始一个新的。
由于
答案 0 :(得分:1)
如果您正在构建健壮性,我强烈建议您考虑使用事件驱动的方法。其中一个具有FTP支持的是Twisted(API)。
优点是您在等待I / O时不会阻塞线程,如果您愿意,可以创建简单的计时器功能来监视您的连接。它也可以更好地扩展。使用事件驱动模式进行编码稍微复杂一些,所以如果这只是一个简单的脚本,它可能或者可能不值得付出额外的努力,但是既然你写的是你正在编写一个守护进程,那么它可能值得研究。
以下是FTP客户端的示例:ftpclient.py