ColdFusion性能和锁定优化

ColdFusion性能和锁定优化,coldfusion,railo,Coldfusion,Railo,我有一个链接,允许用户点击它,它会获取一个zip文件的照片。如果zip文件不存在,它会启动一个线程来创建zip,并向用户显示一条消息,说明当前正在处理这些照片 我试图避免的是,用户反复单击链接,并引发大量线程,试图创建/更新zip文件。zip文件处理相当占用系统资源,因此我只希望允许应用程序一次生成一个zip。如果一个用户忙于编译,它应该什么也不做,并对请求进行排队 目前我是如何处理它的,线程周围有一个cflock: <cflock name="createAlbumZip" type="

我有一个链接,允许用户点击它,它会获取一个zip文件的照片。如果zip文件不存在,它会启动一个线程来创建zip,并向用户显示一条消息,说明当前正在处理这些照片

我试图避免的是,用户反复单击链接,并引发大量线程,试图创建/更新zip文件。zip文件处理相当占用系统资源,因此我只希望允许应用程序一次生成一个zip。如果一个用户忙于编译,它应该什么也不做,并对请求进行排队

目前我是如何处理它的,线程周围有一个cflock:

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

....
我希望在这里发生的事情(如果我测试它,它似乎可以工作)是,它将检查当前是否有一个线程正在使用一个名为“createAlbumZip”的锁运行。如果有,它会将请求排队30秒,然后超时,不会出现任何错误。如果它不能在30秒内创建它,那很好


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

我认为您的代码是错误的。您的意思是“只允许一个线程生成这个新线程”。现在,这可能在您的情况下起作用,因为您设置了超时,这样就没有人可以创建另一个线程,所以两个线程不可能同时执行

你想说的是“只允许一根线做一个拉链”。所以我会这么做

<cfthread .... >
  <cflock>
   ...zip....

……拉链。。。。

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

您需要做的另一件事是将IF语句加倍:

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

…创建zip。。。
这将防止线程B在线程A创建zip时等待,然后线程A完成,线程B继续重新创建/覆盖zip的情况


此外,您可以考虑使用JavaScript来防止单击按钮/链接之后的额外点击。

如果用户多次点击链接(比如说100)来生成ZIP,那么这将不会创建100个线程,如果是这样的话,效率如何?