使用 rsync 作为队列

使用 rsync 作为队列

我是否可以使用 rsync (或类似工具) 来排队请求?

我有一个脚本,用于处理照片(创建各种尺寸的 jpeg),然后将其上传到服务器。该脚本的版本 1 完成了所有处理,然后在最后 rsync 了所有内容。这效率不高,所以我正在尝试将其并行化。

因此,我有一个版本 2 脚本,它处理单张照片,然后在后台仅 rsync 其创建的 jpeg。该脚本的问题在于,它会为处理过的每张照片生成一个新的 rsync 进程。如果处理时间与上传时间相同,那就没问题,但如果上传时间更长,我最终将得到数十个 rsync 进程,速度会慢得像爬行一样。

有没有办法将上传请求传递给单个 rsync 进程,以便以某种方式将它们排队?或者是否有其他应用程序可以执行类似操作?

我从 OS X 客户端运行它并上传到 Linux 服务器。控制这一切的脚本是用 Ruby 编写的。

谢谢大家。

答案1

使用两个线程:

  • 线程 A 只处理您的照片。完成后发送信号。
  • 线程 B 循环执行 rsync,在完成一个 rsync 和启动下一个 rsync 之间可能要等待几秒钟(或几张照片)。不要同时启动两个 rsync。在收到来自 A 的信号后启动的第一个 rsync 完成后完成循环。

这样,您就可以利用 rsync 仅传输更改的事实。除了最后一次迭代之外,所有迭代都将发送至少一个部分文件;但这不会造成永久性损坏,因为它将在下一次迭代中完成。

确保最后一次 rsync 迭代已启动最后一张照片已处理。

答案2

我很想将脚本拆分成 jpeg 生成代码和 rsync 调用代码。这样,您就可以根据需要安排/批量执行 rsync。如果定期上传足够好,您可能通过 cron 运行 rsync,或者,如果您对 OSX 特定的代码感到满意,则可以使用 launchd 的“监视文件夹”功能在新的 jpeg 准备就绪时触发 rsync。

无论使用哪种方法,您仍必须确保不要同时运行过多的 rsync。一个简单的解决方案是将 rsync 调用包装在设置和检查锁定文件(或等效文件)是否存在的代码中。

希望有帮助

相关内容