【问题标题】:Limiting the number of simultaneous instances of a program executed within a Perl script (to >1)限制在 Perl 脚本中执行的程序的同时实例数(>1)
【发布时间】:2017-11-28 22:56:55
【问题描述】:

我在 Perl 脚本中使用资源密集型程序 [特别是 rclone 将文件传输到 Google Drive]。

我还没有弄清楚我想如何调用rclone,因为我需要根据某些条件限制rclone 的实例数量(任何与防止服务器过载相关的,冻结、崩溃等)。我希望脚本在执行 rclone 之前等待 apt 系统“条件”(这可能会持续很长时间或不确定的时间)。

一些细节:

  • 脚本本身本质上是由另一个程序(这个程序用 Python 编写的——调用这个程序<A> 以供参考)传递一个包含(可能很多)文件的文件或目录路径。
  • <A> 只向脚本返回一个值,因此对脚本或rclone 一无所知,除了它接受输入。
  • <A> 无法更改(即更改 <A> 超出了我的理解范围)
  • <A> 以不同的间隔触发 [即有时它会连续多次快速执行脚本(创建多个实例),有时它可能只会每隔几小时、几分钟等触发一次。]
  • 假设 rclone 也不能直接更改(即再次超出我的能力范围)。
  • 如果绝对必要,可以限制脚本实例的数量而不是rclone(虽然我更喜欢它只是rclone,因为脚本完成的处理相当轻,不需要限制) .
  • 模块很好用。
  • 我希望避免使用类似 Unix 的操作系统命令,例如 pgrepps(除非绝对必要)。

目前,我正在使用一个写得很糟糕的 bash 脚本来代替 Perl 脚本。 bash 脚本使用pgrep -wcsleepwhile 循环和if 语句实现了一个基本的(设计不佳的)“检查/睡眠循环”。 (说实话,我什至不认为 bash 脚本真的有效/帮助 atm。)

【问题讨论】:

  • 您可以以sem -j N 的身份调用GNU Parallel,它只允许N 实例并行运行stackoverflow.com/a/46206137/2836621gnu.org/software/parallel/sem.html
  • @Mark 啊,是的,完全忘记了那个有用的程序,它也是用 Perl 编写的。如果命令被多次调用,并且每次都在一个 不同的 脚本中,你知道信号量功能是否有效吗?也就是说——使用厕所类比——每个脚本实例是否都有自己的“厕所房间”,其他脚本实例无法访问,还是所有脚本实例都使用同一个“房间”?
  • 是的,只要不同的程序都给出相同的--id,就像我链接的答案一样。
  • 如果服务器冻结是一个问题,您可以使用--timeout 杀死rclone,如果它花费的时间比预期的要长。

标签: perl


【解决方案1】:

我暂时假设您的脚本是唯一运行rclone 的东西。如果您只想运行 1 个副本,you would just use a lockfile

对于 N 个实例(对于小 N),我只需要 N 个锁文件 - 让程序在循环中依次尝试每个锁;如果所有锁都已被持有,则暂停并在循环中重试 1 秒。获得锁后,运行rclone,完成后释放锁。


更合理的方法是使用 SysV 信号量,但是,除非您想要一个大的 N、真正关心响应时间或担心调用者之间的公平性,否则可能不值得花时间学习它们。


如果您的脚本不是唯一调用 rclone 的程序,则需要拦截所有调用 - 而不是将此代码放入您的程序中,可以将 rclone 替换为实现上述并行约束的包装器,然后调用真正的程序。

【讨论】:

    【解决方案2】:

    GNU Parallel 可以处理作业队列 @9​​87654321@

    true >jobqueue; tail -n+0 -f jobqueue | parallel -j10 --timeout 1h rclone
    

    然后像这样运行<A>

    <A> >> jobqueue
    

    您有时必须清理jobqueue。但除非&lt;A&gt; 产生大量数据,否则通常只需在每次重新启动时将其归零(true &gt;jobqueue)就足够了。

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2015-03-15
      • 2021-02-12
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多