代码之家  ›  专栏  ›  技术社区  ›  orokusaki

线程安全的Web应用程序-为什么重要?

  •  3
  • orokusaki  · 技术社区  · 15 年前

    为什么网络应用程序中的线程安全很重要?pylons(python web框架)使用了一个全局应用程序变量,它不是线程安全的。这有关系吗?如果我打算使用多线程,这只是一个问题吗?或者,这是否意味着如果另一个用户…我只是把自己搞糊涂了。这有什么重要的?

    5 回复  |  直到 15 年前
        1
  •  2
  •   Michael Lorton    15 年前

    线程错误可能导致严重和微妙的问题。

    假设你的系统有10个成员。另外一个用户登录到您的系统,应用程序将他添加到名册并增加成员计数;“同时”,另一个用户退出,应用程序将他从名册中删除并减少成员计数。

    如果您没有正确处理线程,那么您的成员计数(应该是10)很容易是9、10或11, 你再也不能复制这个虫子了 .

    所以小心点。

        2
  •  1
  •   Cratylus    15 年前

    你应该关心线程安全。例如,在Java中编写一个提供一些功能的servlet。容器将部署servlet的一个实例,当HTTP请求从客户端到达时,通过不同的TCP连接,每个请求都由一个单独的线程处理,该线程反过来将调用servlet。因此,可以从多个线程调用servlet。因此,如果它不是线程安全的,那么由于线程访问共享数据的数据损坏,错误的结果将返回给用户。

        3
  •  1
  •   Tim Yates    15 年前

    它实际上取决于应用程序框架(在本例中我对此一无所知)以及Web服务器如何处理它。显然,任何一个好的Web服务器都将同时响应多个请求,因此它将使用多个线程进行操作。该Web服务器可能会针对所有这些请求发送到应用程序代码的单个实例,或者它可能会生成Web应用程序的多个实例,并且从不同时使用给定的实例。

    即使应用服务器使用单独的实例,您的应用程序也可能有一些共享状态——例如,一个包含用户列表的数据库。在这种情况下,您需要确保可以从Web应用的多个线程/实例安全地访问状态。

    当然,还有一种情况是在应用程序中显式地使用线程。在这种情况下,答案是显而易见的。

        4
  •  1
  •   orokusaki    15 年前

    你的 Web应用程序 几乎总是多线程的。即使您可能没有显式地使用线程。所以,要回答你的问题: 这很重要 .

    怎么会这样?通常,Apache(或IIS)会同时提供多个请求,从多个线程调用您的Python程序多次。因此,您需要考虑您的程序同时在多个线程中运行,并相应地进行操作。

        5
  •  1
  •   orokusaki    15 年前

    (这太长了,无法对其他好答案添加评论。)

    并发性问题(读:对共享状态的多个访问)是一组超级线程问题。(并发性问题)可以很容易地存在于“高于线程”的级别上,例如进程/服务器级别(在上面提到的情况下,全局变量是进程唯一值,如果存在多个进程,这反过来会导致不一致的视图/状态)。

    必须注意分析数据一致性需求,然后实施软件以满足这些需求。我总是错误地站在安全的一边,只会在仔细分析的可以接受的地方降级。

    但是,请注意,CPython只为Python代码执行只运行一个线程上下文(以获得真正的并发线程,您需要编写/使用C扩展),因此,虽然您可以在预期数据上获得一个竞争条件的形式,但不会得到(所有)相同类型的部分写入方案,并且可能会危及C/C++程序。但是,再一次。在一致视图方面出错。

    有很多种 现有的 跨线程或进程访问全局原子的方法。使用它们。