2012-03-08 80 views
2

我有一个链接,将允许用户点击它,它会获取照片的zip文件。如果该zip文件不存在,则它会启动一个线程来创建该zip文件,并向用户显示一条消息,指出该照片当前正在处理中。ColdFusion性能和锁定优化

我试图避免的是用户反复点击链接,并设置了大量的线程,将尝试创建/更新zip文件。压缩文件处理是相当系统资源密集型的,所以我只想让应用程序一次生成一个压缩文件。如果一个人忙于编译,它应该什么也不做,并排队请求。

目前我是怎么处理它与螺纹围绕CFLOCK:

<cflock name="createAlbumZip" type="exclusive" timeout="30" throwontimeout="no"> 
    <cfthread action="run" albumId="#arguments.albumId#" name="#CreateUUID()#"> 
    .... 

什么我希望在这里发生(这似乎是工作,如果我测试它)是,它会检查是否有目前是使用名为'createAlbumZip'的锁运行的线程。如果有,它会将请求排队30秒,之后它应该超时而没有任何错误。如果它无法在30秒内完成创建。

所以 - 这似乎是工作,但我的问题是:这是处理这种情况的最佳方式?锁定正确的方法?我没有看到这种方法可能产生的缺点吗?

回答

2

有一百万种方法来剥皮这只猫。锁定是一个好的开始,根据您对@Pat Branley的回答的评论,我认为您创建线程之外的锁定可能会更有效一些,因为您提出的理由是:创建数十个线程的潜力将会存在,这些线程的整个生命周期将包括等待锁打开或超时。

你需要做的另一件事是在IF语句翻倍:

<cfif not (zip file exists)> 
    <cflock ...> 
    <cfif not (zip file exists)> 
     <cfthread> 
     ...create zip... 
     </cfthread> 
    </cfif> 
    </cflock> 
</cfif> 

这将防止在那里,而线程A创建ZIP线程B等待的情况,然后线程A结束,并且线程B继续重新创建/覆盖它。

此外,您可以考虑使用JavaScript来阻止额外的点击,方法是在点击按钮后禁用按钮/链接。

0

我想你有错误的方式代码。你所说的是'只有一个线程可以产生这个新线程'。现在这可能适用于你的情况,因为你设置了超时设置,这样任何人都不能创建另一个线程,所以两个线程都不会一次执行。

你想说的是'只允许一个线程进行压缩'。所以我会这样做

<cfthread .... > 
    <cflock> 
    ...zip.... 
+0

因此,如果用户多次点击链接(比方说100)来生成zip,是不是会创建100个线程,如果是的话,那么效率如何? – Cheeky 2012-03-09 10:33:13