我有一个循环,运行了几千条记录,对于每个记录,它点击是在服务器上进行一些图像大小调整和操作。该过程在小型记录集的测试中运行良好,但当它移动到实时服务器时,我希望在50个记录之后暂停并恢复该过程,因此服务器不会被征税到性能缓慢或完全退出。
代码如下所示:
<cfloop query="imageRecords">
<!--create and save images to server - sometimes 3 - 7 images for each record -->
</cfloop>
像我说的那样,我想在50条记录之后暂停,然后从中断处继续。我查看cfschedule
,但不确定如何将其用于此。
我还查看了sleep()函数,但文档讨论了在cfthread
标记中使用它的问题。其他人发布了关于使用它来模拟长流程的文章。
所以,我不确定sleep()
能否以我需要的方式安全地使用。
服务器是CF9,db是MySQL。
答案 0 :(得分:3)
我会在数据库中创建一个名为working的列,默认为0,一旦图像更新,将标志设置为1.然后您的查询可以是
SELECT TOP 50 imagename
FROM images
WHERE worked = 0
然后设置CF计划任务以每x分钟运行
答案 1 :(得分:0)
这是一种不同的方法,您可以将其与任何其他方法结合使用:
<cfscript>
th=CreateObject("java","java.lang.Thread");
th.setPriority(th.MIN_PRIORITY);
// Your work here
th.setPriority(th.NORM_PRIORITY);
</cfscript>
应该将线程设置为低于为其他请求提供服务的其他线程的优先级。从理论上讲,您可以在最短的时间内完成工作,但对其他用户的影响较小。我还没有机会测试这个,所以你的里程可能会有所不同。