http和线程

时间:2009-11-18 08:29:09

标签: http

http是无状态的...变量和对象在每个请求中被销毁...我们有会话来维护状态......

但是线程如何适用于http呢?这是否意味着如果任何数量的用户都使用一个帐户或尝试更新我的数据库中的一条记录(我知道DBMS上的锁定),我只能摆弄cookie和会话数据?

是否没有信号量和互斥量的网络编程等价物?

5 个答案:

答案 0 :(得分:2)

线程不以任何方式适用于HTTP。 HTTP服务器可以使用线程实现,但它也可以阻止每个请求,直到前一个请求完成。

关于对数据库和其他后端系统资源的访问,这不依赖于使用线程,多个进程或事件系统的HTTP服务器。

答案 1 :(得分:2)

我认为你的问题是“如何管理并发更新” - 如果我错了,请纠正我。

对此有很多解决方案,但这里有几个常见的解决方案。

1)上次更新获胜 这是最常见的解决方案。如果两个人正在编辑相同的记录,则按“go”的最后一个人获胜。这在设计上并不常见 - 但如果您不考虑并发更新,则会发生这种情况。

2)时间戳 您可以为所有数据设置时间戳。当您尝试将数据提交回数据库时,首先要检查数据库中的时间戳是否相同。如果它已更改,则拒绝更新,因为其他人在此期间更改了信息。

3)寻找变化 您只能提交用户更改的字段(例如,如果您显示包含10个项目的表单,并且它们只更改1,则只将该值存储回数据库)。这背后的逻辑是,如果有人更改了不同的字段,则不会通过使用现在的前一个值覆盖它来影响它 - 如果它们与他们更改的字段相同,那么您的数据在技术上是“更新”。

还有其他解决方案,但这些都很常见。

答案 2 :(得分:0)

通常,您可以为任何其他程序使用与Web编程相同的线程构造。但是,由于Web应用程序(或应该)是短时间运行的,并且线程实际上为短期任务增加了一些开销,因此这样做可能无法获得太多收益。请记住,Web基础结构通常使用线程或进程以某种并发方式运行Web应用程序。

答案 3 :(得分:0)

是的,如果在会话中放置太多状态,同时打开多个浏览器窗口同一站点的同一用户可能会使系统混淆不清。

例如,如果您有一个数据输入表单而不是在页面之间发布数据(它有一组完全不同的问题,主要是数据可以被篡改),您将输入值放入会话中,这当用户打开三次相同的表单时会遇到问题。

我认为这只是一个部分解决的问题,有一本关于最佳实践的完整食谱。在上面的示例中,您可以在每次打开表单时发出新的事务(或会话)ID,以便与表单的一个实例关联的任何内容都不会影响其他实例。

答案 4 :(得分:0)

HTTP和线程是两回事。大多数HTTP服务器使用线程能够在“相同”时间回答许多请求。例如,一个脚踏可以呈现HTML作为响应,而另一个线程等待DB找到一些数据,而第三个脚本解码下一个请求。

所以会发生什么是您在服务器上有无状态请求/响应周期和状态。为了能够将两者匹配以构建对话,应用程序服务器(构建在HTTP上作为通信手段)使用会话cookie来识别属于同一对话的请求。否则,它将无法分辨他们正在与谁交谈。 IP地址在这里不起作用,因为很多用户可能在代理后面(所以他们都有相同的IP地址)。

在应用服务器中,会话cookie中的魔术字符串将映射到添加到您的请求中的会话对象。这允许您在会话中保存会话状态并记住您的位置,即使HTTP本身是无状态的。