“Pythonic”多线程(并发)语言

时间:2010-10-12 05:26:55

标签: python multithreading multiprocessing concurrency

我现在主要用python编写,但是我正在寻找一种更加线程友好的语言(不是JAVA,C#,C或C ++)。

Python的线程在IO绑定时是很好的,但是当我在做CPU密集型操作时它会变短。

有什么想法吗?

谢谢, 詹姆斯

8 个答案:

答案 0 :(得分:7)

Clojure非常有趣,如果你喜欢这样的话。它是在JVM上运行的lisp。显然,尽管是动态类型*,它对于很多事情来说都和Java一样快。 Java互操作就像我想象的那样方便,虽然本机的clojure库已经足够好了,你不需要在大多数事情上都能使用Java。

它还增加了一些“脚本语言”感觉,如地图( - > Python dicts)和矢量( - > Python列表),以帮助减少括号发作的可能性。

哦,对,并发。它使用软件事务存储系统,这本身就很有趣。 Extra, extra: Read all about it

*:我认为您可能需要使用“类型提示”来获得许多任务的类似Java的速度。这在Clojure中非常方便。

答案 1 :(得分:4)

在其他任何事情之前,您试图解决哪些编程问题? GIL实际上已成为瓶颈吗? (如果你不确定,可能没有。)

如果不知道这一点,你就有可能寻找适合你锤子的钉子,而不是相反。

如果你真的,真的知道GIL已成为瓶颈,并且你需要在多个处理器上处理数字,那么你要考虑:

  1. 如果您已知道CPU关键部分,请使用Pyrex / Cython使用C类型声明进行编译,如果可以的话。这将首先使它们比Python字节码解释更加节省CPU,并且作为奖励,允许您在不需要它的部分周围发布GIL。 (道德:在尝试将它们并行化之前,将你的驴子变成赛马。)
  2. 不言而喻,如果您使用任何CPU密集型扩展模块,请确保它们尚未为您发布GIL。
  3. 对于几乎所有其他内容,请使用内置的multiprocessing模块。这为您提供了与threading大致相同的API和优势,但为您提供了真正的进程级并发:除此之外,这使您可以轻松地在多个CPU上运行CPU密集型代码一致的机器,如果你的问题实际上变得很大,这是至关重要的。

答案 2 :(得分:3)

boo的语法是受Python启发的。但是编程语言有点不同:它是强类型的类型推理,它最重要的特征可能是开放的编译器管道,即创建语法宏的能力(在LISP意义上的“宏”一词,而不是在C语言中的“预处理器宏”)。

显然,IronPyton非常pythonic,并且与其他.NET语言一样擅长线程化。

答案 3 :(得分:2)

<{3}}开发人员使用的{p> Stackless Python可能适合。

  

EVE online是一个增强版   Python编程的版本   语言。它允许程序员   获得基于线程的好处   编程没有性能   和复杂性相关的问题   与传统的线程。该   Stackless增加的微线程   Python便宜又轻巧   方便,如果使用得当,   不仅可以作为一种方式   构建应用程序或框架,   但通过这样做改进计划   结构和便于阅读   代码。

答案 4 :(得分:1)

要克服GIL,你可以尝试用jython而不是cpython来解释python语言

答案 5 :(得分:1)

Python涉及到CPU密集型任务,因为Python不是一种非常有效的语言。许多“动态”语言都有这个问题,因为编译器在编译时对程序的假设是有限的。例如,方法调用可能必须每次都被查找,以防有人在每次调用之间替换对象上的方法。

我建议你看一下Erlang,尽管你的意思可能不是“Pythonic”。 : - )

答案 6 :(得分:1)

接受提示。 CPU密集型程序也可以制作成多个进程。多个流程和传递状态的管道通常具有出色的性能。

不要随意捕捉其他语言,而是这样做。

  1. 将问题分解为可以同时执行的步骤流程。

    在shell中,顶级脚本是:a.py | b.py | c.py | d.py ...

  2. 将每个步骤写成一个非常小的Python循环,从sys.stdin读取并写入sys.stdout。有趣的是,这是raw_input()print()的默认设置。

  3. 衡量表现。

  4. 你 - 正确 - 花费你所有的时间来设计你的算法。你将花很少的时间编写或学习一门新语言。您可以轻松地在每个可用CPU上占用每个核心。你将花时间在线程同步或其他愚蠢上。

    对于“CPU密集型”应用程序来说,这种方式非常有效。

答案 7 :(得分:1)

您可以使用python multiprocessing它镜像线程的API,但运行单独的进程。可能不适用于非posix。对于一般的CPU密集型问题,您可以随时尝试Stackless Python(已提及)或Pyrex