代码之家  ›  专栏  ›  技术社区  ›  Roman Starkov

有没有线程的实用替代方案?

  •  12
  • Roman Starkov  · 技术社区  · 16 年前

    在阅读sqlite时,我在常见问题解答中偶然发现了这句话: "Threads are evil. Avoid them."

    我很尊重sqlite,所以我不能忽视这一点。我在想,根据“避免他们”的策略,我还能用什么来替代,以使我的任务并行化。例如,我目前正在开发的应用程序需要一个始终响应的用户界面,并且需要不时地轮询几个网站(每个网站至少需要30秒的过程)。

    因此,我打开了这个FAQ链接的PDF,从本质上看,这篇文章似乎提出了一些要应用的技术 在一起 使用线程,例如屏障或事务性内存,而不是完全替换线程的任何技术。

    考虑到这些技术并没有完全消除线程(除非我误解了论文的意思),我可以看到两个选项:要么是sqlite faq 不是字面上的 是指它所说的,还是存在实际的方法 避免 全部使用螺纹。有吗?


    关于微线程/协同调度作为一种替代方法,这在小例子中看起来很好,但是我想知道一个大型的UI重的应用程序是否可以以一种单独的协作方式实际上并行化。如果你已经成功地完成了这项工作,或者知道了这样的例子,这肯定是一个有效的答案!

    12 回复  |  直到 8 年前
        1
  •  6
  •   Wayne Conrad    8 年前

    注释 :这个答案不再准确地反映我对这个主题的看法。我不喜欢它过于戏剧化,有点难听的语气。此外,我不太确定,对可证明是正确的软件的追求,是如此无用,我似乎回想起当时。我离开这个答案是因为它是被接受的,并且被投了赞成票,并且把它编辑成我目前认为会破坏它的东西。


    我终于有时间看报纸了。我从哪里开始?

    作者正在唱一首老歌,这首歌是这样写的:“如果你不能证明程序是正确的,我们都注定了!”当尖叫声伴随着过度调制的电吉他和快速的鼓声时,听起来最好。当计算机科学在数学领域时,学术界就开始唱这首歌,在这个世界里,如果你没有证据,你什么都没有。即使在第一个计算机科学系从数学系分离出来之后,他们仍然在唱那首歌。他们今天在唱那首歌,没有人在听。为什么?因为我们其他人都在忙着创造有用的东西,好的东西是用软件做出来的,不能被证明是正确的。

    线程的存在使得证明一个程序是正确的更加困难,但是谁在乎呢?即使没有线程,也只能证明最微不足道的程序是正确的。为什么我要关心我的非平凡的程序,不能证明是正确的,在我使用线程之后,是否更不可靠?我不。

    如果你不确定作者生活在一个学术梦境中,你可以在他坚持认为作为线程替代的协调语言最好用“视觉语法”(在屏幕上绘制图形)来表达后确定。我以前从来没有听过这个建议,除了我职业生涯的每一年。一种只能由图形用户界面操作的语言,不能与任何程序员常用的工具一起使用,这并不是一种改进。作者继续引用UML作为一个视觉语法的例子,它是“常规地与C++和Java相结合”。

    同时,我和许多其他程序员继续使用线程,没有那么多麻烦。如何正确、安全地使用线程是一个基本上可以解决的问题,只要您不完全依赖于可验证性。

    看。穿线是一个大孩子的玩具,你需要知道一些理论和使用模式才能很好地使用它们。就像数据库、分布式处理或任何其他小学以外的设备一样,程序员每天都能成功地使用这些设备。但仅仅因为你不能证明它是正确的并不意味着它是错误的。

        2
  •  5
  •   Robert Harvey    16 年前

    正如我读到的,sqlite faq中的语句只是一个关于线程对于未初始化者有多困难的注释。 这是作者的观点,可能是一个有效的观点。但是说你不应该用线是把孩子和洗澡水一起扔出去,在 我的 意见。螺纹是一种工具。像所有工具一样,它们可以被使用,也可以被滥用。我能读懂他的论文,相信线程是魔鬼,但我已经成功地使用了它们, 没有 杀死小猫。

    请记住,sqlite被编写成尽可能轻量级和易于理解(从编码的角度),所以我认为线程是这种轻量级方法的对立面。

    另外,sqlite并不打算在高度并发的环境中使用。如果你有一个这样的数据库,你最好使用一个更具企业精神的数据库,比如Postgres。

        3
  •  2
  •   Josh    16 年前

    邪恶,但必要的邪恶。线程的高级抽象(例如.NET中的任务)正变得越来越常见,但在大多数情况下,业界并没有试图找到避免线程的方法,只是使处理任何类型的并发编程所带来的复杂性变得更加容易。

        4
  •  2
  •   D.C.    16 年前

    我注意到的一个趋势,至少在Cocoa领域,是来自框架的帮助。苹果已经竭尽全力帮助开发人员处理并发编程这一相对困难的概念。我看到的一些事情:

    • 不同的线程粒度。Cocoa支持从POSIX线程(低级)到带有nslock和nsthread的面向对象线程,再到高级并行性(如nsoperation)。根据任务的不同,使用高级工具(如nsoperation)更容易,也能完成任务。

    • 通过API在后台进行线程处理。Cocoa中的很多UI和动画都隐藏在API后面。您负责调用API方法,并提供在辅助线程完成时执行的异步回调(例如,某些动画结束)。

        5
  •  2
  •   Mike DeSimone    16 年前
        7
  •  2
  •   Szere Dyeri    16 年前
        8
  •  2
  •   Breton    16 年前

        10
  •  1
  •   zneak    16 年前

        11
  •  1
  •   Jacob    16 年前

        12
  •  0
  •   SF.    16 年前