提问者:小点点

在一个线程中排队请求以进行长轮询


我是一个新手,但我真的很喜欢长轮询的想法。
在阅读了它之后,我会这样实现它:

  1. 客户端请求服务器(AJAX)
  2. 服务器正在轮询DB以获取更改
  3. 识别更改时或服务器响应超时后

我的问题是,对于每一个请求,都在服务器上启动一个线程,并且每个线程都轮询DB。

在服务器上运行一个接受所有传入请求的线程不是更有效吗?例如:

  1. 客户端请求服务器(AJAX)
  2. 服务器将请求添加到队列(无响应)
  3. 辅助线程轮询数据库以获取与队列中所有请求相关的更改
  4. 识别更改时,服务器返回相应请求的结果

这样做的好处是,对DB的轮询要少得多,所有请求都在一个线程中处理(更少的内存消耗)

我的问题:
这是可能的吗/有没有实现或框架?
(我们的项目还没有启动jet,所以使用PHP还是ASP.NET都无关紧要)

您的建议TIA=)


共2个答案

匿名用户

检查node.js和非阻塞IO

匿名用户

我无法帮助您处理启动新线程的每个请求--我不知道是否有一种方法让一个线程处理所有请求,或者那是一个实用的解决方案。

您可以让一个线程负责数据库轮询--我强烈建议这样做,因为不需要让多个线程同时查询完全相同的数据。

使用application对象。IE应用程序[“ThreadActive”]=true;

if (!Application["ThreadActive"])
ThreadPool.QueueUserWorkItem(new WaitCallback (DBWatcher), objectdata);

让DBWatcher方法自身在内部循环X小时,将application[“threadactive”]转到false,然后结束线程。当线程运行时,让它将检索到的数据存储在cache对象中。线程(或者单线程,如果您可以管理的话)将监视cache并相应地响应长轮询。

我希望您能找到一个更有效的解决方案,但至少这将限制您与数据库的一个开放连接,而不是谁知道多少个。