脚本A中的sleep()是否将允许脚本B运行?

问题描述 投票:0回答:1

我有许多每天运行多次的脚本。一些脚本每5分钟运行一次,其他脚本每10、15、60分钟运行,等等。大多数脚本处理大量数据,它们在其中循环遍历并处理每一行。

我的主持人的时间表不允许我确定每个脚本的启动时间,我只能选择相隔的分钟数,因此每5分钟运行一次的脚本的运行时间为00,05,10,15 ...每10分钟运行一次的脚本的运行时间为00、10、20、30 ...等

这意味着很多脚本从00开始运行。

这不是真正的问题,除了普通用户也使用服务器,而该用户通常只需要做一些不需要很多时间的事情。但是,如果它们恰好在许多脚本正在运行时正在执行此操作,则一切都会变慢,并且即使没有等待很长时间也无法执行那些简单的操作。

我读到某个地方,睡眠功能会阻止CPU处理数据,并允许运行较小的任务。你知道吗如果我要在许多这样的脚本的每个循环后插入sleep(1),是否可以提高个别用户执行小任务时看到的性能,即允许他们跳过这一行?

示例每5分钟运行一次的脚本A

foreach ($a_hundred_things as $one_thing) {
  do_this($one_thing);
  // would adding sleep(1); here improve performance?
}

用户单击按钮时运行的脚本B

do_this_thing_that_only_takes_a_minute();

目前,如果正在运行脚本A之类的脚本(以及许多其他类似的脚本),则用户有时必须等待很长时间(几分钟)才能运行脚本B。我希望B能够以某种方式获得优先权,因为这不能等待,而自动脚本却可以延迟。

是否会在脚本A(和同时运行的所有其他类似脚本)中添加sleep(1)来提高性能?我知道我可以尝试对其进行测试,但是其中涉及很多脚本,而且似乎并非每次都发生。

php performance cpu sleep
1个回答
0
投票

最重要的是,usleep()让您指定要睡多少微秒,这是高级功能。

以下是k俩,但可以在实施更好的解决方案时帮助减轻打击:

  1. 在cron的开头插入几秒钟的随机等待,以使它们不会一次全部启动。这样可以防止您的计算机每15分钟完全被slammed完全初始化。

    usleep(mt_rand(0,10000000));
    
  2. 贫民窟节流。测量执行一次循环迭代然后睡眠那么长时间所需的时间。您已经有效地将性能降低了一半。

    while($condition) {
      $start = microtime(true);
      // do work
      usleep( (microtime(true) - $start) * 1000000) );
    }
    

Actual您应该使用的解决方案,请注意,这些解决方案不是互斥的:

  1. 将定期/异步任务分配给一台或多台其他计算机。没有理由直接影响用户请求的工作不会对面向用户的基础架构的性能产生负面影响。

  2. 将队列/工作模型用于异步任务,并且仅使用cron定期提交作业进行处理。这大致等于:

    1. 创建通用工作进程。
    2. 设置任务队列。 [我推荐兼容AMQP的队列系统,个人更喜欢RabbitMQ]
    3. [启动一个或多个工作流程,例如Supervisord这样使保持一小群工作人员的工作变得简单。

糟糕!您已经实现了这两个吗?这就是所谓的“水平扩展”,也是我们在2020年构建现代应用程序的方式。现在,您可以按需,甚至自动地按需启动机器和流程。很抱歉给您带来方便。 :P

© www.soinside.com 2019 - 2024. All rights reserved.