Python中观看和可靠上传文件的最佳实践是什么?

4
我正在使用Python 2.7构建一个Windows桌面应用程序。该应用程序的主要功能是监视文件夹中是否有新文件。每当该文件夹中出现新文件时,该应用程序会将其上传到远程服务器。远程服务器上的进程会为该文件创建一个数据库记录,并在该记录中存储远程文件路径。
目前,我正在使用watchdog来监视目录,并使用httplib进行文件上传。
问题如下:
  1. 无论网络条件或互联网连接是否丢失,我应采取哪种方法来确保可靠地上传新文件?
  2. 更新:我所说的可靠上传是指应用程序即使重新启动也会上传文件。一些文件相当大(>100 MB),因此简单的解决方案如在try / catch中包装代码并重新开始上传不是非常有效。我知道Dropbox使用librsync,但在这种情况下可能有点过度。

  3. 如果在上传期间更改了源文件怎么办?我应该停止上传并重新开始吗?

对于你的第一个问题,我认为你可以捕获任何异常并重试;在 while True 中使用 try except 语句。 - Zeinab Abbasimazar
@ZeinabAbbasi 我想我有点偏离重点了。我所说的“可靠性”不仅仅是在while True循环中重试。我需要应用程序即使在程序重新启动时也能上传这些文件。即使PC重新启动也是如此。我相信Dropbox以某种方式实现了这一点。我不知道这里的最佳实践,但我认为它是保持要上传的文件队列或在每次失败后使用librsync来跳过反复上传同一文件(文件可能很大)的某种形式。我会更新问题。 - Warwick
1个回答

1
你可以维护文件或文件名、时间戳和上传状态信息的数据库。基于这些数据,您将知道哪些文件已经发送,以及在应用程序或计算机重新启动后需要上传哪些文件。
检查时间戳可以告诉您文件是否已被修改,应该重新开始上传过程。

好主意!我认为这就是Dropbox正在做的事情:将文件列表保存在数据库中。你会如何在多任务方面设计这个应用程序?现在我正在一个进程(或线程,因为我正在使用“watchdog”)中完成所有操作。 - Warwick
1
@Warwick 你应该使用线程池来控制同时上传的数量看这里。我会这样做:1. 将文件上传请求的数据添加到数据库中;2. 将这些请求添加到线程池中;3. 在任何单个上传成功时更新适当的数据库行;4. 在任何单个上传失败时再次将上传请求添加到线程池;5. 我会有另一个线程定期检查数据库中未成功的请求,并将它们再次添加到线程池中。也许可以再发一个问题 :) - Rafał Spryszyński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接