为什么在网络应用中线程安全? Pylons(Python Web框架)使用一个非线程安全的全局应用程序变量。这有关系吗?如果我打算使用多线程,这只是一个问题吗?或者,这是否意味着如果另一个用户,一个用户可能没有更新状态......我只是在困惑自己。这有什么重要意义?
答案 0 :(得分:2)
线程错误可能会导致严重而微妙的问题。
假设您的系统有10个成员。还有一个用户注册到您的系统,应用程序将他添加到名单中并增加成员数量; “同时”,另一个用户退出,应用程序将他从名单中删除并减少成员数量。
如果您没有正确处理线程,您的成员数(应该是10)可能很容易就是9,10或11,并且您永远无法重现该错误。
所以要小心。
答案 1 :(得分:1)
你应该关心线程安全。例如,在java中编写一个提供某些功能的servlet。容器将部署您的servlet实例,并且当HTTP请求从客户端到达时,通过不同的TCP连接,每个请求由一个单独的线程处理,而该线程又将调用您的servlet。因此,您将从多个线程调用您的servlet。因此,如果它不是线程安全的,那么由于线程访问共享数据的数据损坏,将错误的结果返回给用户。
答案 2 :(得分:1)
这实际上取决于应用程序框架(在这种情况下我一无所知)以及Web服务器如何处理它。显然,任何好的网络服务器都会同时响应多个请求,因此它将使用多个线程进行操作。该Web服务器可能会为所有这些请求分派给您的应用程序代码的单个实例,或者它可能会生成Web应用程序的多个实例,并且永远不会同时使用给定的实例。
即使应用服务器确实使用单独的实例,您的应用程序也可能具有某种共享状态 - 例如,包含用户列表的数据库。在这种情况下,您需要确保可以从Web应用程序的多个线程/实例安全地访问状态。
然后,当然,您可以在应用程序中明确使用线程。在这种情况下,答案是显而易见的。
答案 3 :(得分:1)
您的 Web应用程序几乎总是多线程的。即使你可能没有明确使用线程。所以,回答你的问题:非常重要。
这怎么可能发生?通常,Apache(或IIS)将同时提供多个请求,从多个线程多次调用您的python程序。因此,您需要考虑您的程序同时在多个线程中运行并采取相应的行动。
答案 4 :(得分:1)
(这对其他好的答案添加评论太长了。)
并发问题(读取:对共享状态的多次访问)是一组超级线程问题。 (并发问题)很容易存在于“上层线程”级别,例如进程/服务器级别(在上面提到的情况下,全局变量是进程唯一值,这反过来会导致视图/状态不一致,如果有多个过程)。
必须注意分析数据一致性要求,然后实施软件以满足这些要求。我总是站在安全的一边,只有在可以接受的仔细分析区域才会降级。
但是,请注意,CPython只运行一个用于Python代码执行的线程上下文(以获得需要编写/使用C扩展的真正并发线程),因此,虽然您可以在预期数据上获得一种竞争条件,但您赢了得到(所有)相同类型的部分写入场景,这可能会困扰C / C ++程序。但是,再一次。错误的是一致的观点。
有许多现有的方法可以跨线程或进程访问全局原子。使用它们。