0

我有一个循环运行数千条记录,并且对于它命中的每条记录都在服务器上进行一些图像大小调整和操作。该过程在测试一个小记录集时运行良好,但是当它移动到实时服务器时,我想在 50 条记录后暂停并恢复该过程,这样服务器就不会被征税到性能缓慢或完全退出的地步。

代码如下所示:

<cfloop query="imageRecords">
    <!--create and save images to server - sometimes 3 - 7 images for each record -->
</cfloop>

就像我说的,我想在 50 条记录后暂停,然后从中断的地方继续。我看了看,cfschedule但不确定如何将其应用于此。

我还查看了sleep()函数,但文档讨论了在cfthread标签中使用它。其他人已经发布了关于使用它来模拟长流程的信息。

所以,我不确定sleep()能否以我需要的方式安全使用。

服务器是 CF9,数据库是 MySQL。

4

2 回答 2

3

我将在默认为 0 的数据库中创建一个名为 working 的列,一旦图像更新,将标志设置为 1。然后您的查询可以类似于

SELECT TOP 50 imagename
FROM images
WHERE worked = 0

然后设置一个 CF 计划任务每​​ x 分钟运行一次

于 2012-08-16T16:19:30.850 回答
0

这是一种不同的方法,您可以将其与其他任何方法结合使用:

<cfscript>
th=CreateObject("java","java.lang.Thread");
th.setPriority(th.MIN_PRIORITY);
// Your work here
th.setPriority(th.NORM_PRIORITY);
</cfscript>

这应该将线程设置为比为您的其他请求提供服务的其他线程具有更低的优先级。理论上,您将在最短的时间内完成工作,但对其他用户的影响较小。我还没有机会对此进行测试,因此您的里程可能会有所不同。

于 2012-08-16T20:37:48.833 回答