我现在主要使用Python编程,但是我正在寻找一种更适合多线程的语言(不是JAVA、C#、C或C++)。
当使用Python进行IO绑定时,它的线程效果很好,但是当我进行CPU密集型任务时,它就表现不佳了。
有什么好的建议吗?
谢谢, 詹姆斯
我现在主要使用Python编程,但是我正在寻找一种更适合多线程的语言(不是JAVA、C#、C或C++)。
当使用Python进行IO绑定时,它的线程效果很好,但是当我进行CPU密集型任务时,它就表现不佳了。
有什么好的建议吗?
谢谢, 詹姆斯
multiprocessing
模块。这提供了与threading
大致相同的API和优势,但为您提供真正的进程级并发性:除其他外,这使您可以轻松地将CPU密集型代码协调在多台机器上运行,这对于实际问题变得很大至关重要。Boo的语法受到Python的启发。但是,这种编程语言有一些不同之处:它是强类型的,并且具有类型推断功能,其最重要的特性可能是开放的编译器管道,即能够创建语法宏(在LISP中的“宏”意义上,而不是C中的“预处理器宏”)。
显然,IronPython非常符合Python风格,与其他.NET语言一样擅长线程处理。
boo
有语法宏。很棒。 - intuited“Stackless Python” 是 Python 编程语言的增强版。它允许程序员享受基于线程的编程的好处,而不会出现传统线程所带来的性能和复杂性问题。Stackless 添加到 Python 中的微线程是一种廉价且轻量级的便利工具,如果使用得当,不仅可以作为组织应用程序或框架的方式,而且通过这样做改善程序结构并促进更易读的代码。
为了克服GIL,您可以尝试使用Jython解释Python语言,而不是CPython。
Python在处理CPU密集型任务时表现不佳,因为Python不是一种非常高效的语言。许多“动态”语言都有这个问题,因为编译器在编译时对程序可以做出的假设受到限制。例如,方法调用可能需要每次查找,以防某人在每次调用之间替换了对象上的方法。
我建议您看看Erlang,尽管它可能不符合您对“Pythonic”的理解。 :-)
抓住提示。CPU密集型程序也可以分成多个进程。多个进程和通过管道传递状态通常具有出色的性能。
与其随机寻找其他语言,不如这样做:
将问题分解为可以并发完成的步骤管道。
在shell中,顶级脚本是这样的:a.py | b.py | c.py | d.py
...
将每个步骤编写为非常小的Python循环,从sys.stdin
读取并写入sys.stdout
。有趣的是,这是raw_input()
和print()
的默认设置,使事情变得简单。
测量性能。
你会--正确地--花费所有时间设计你的算法。你会很少花时间编码或学习一种新语言。你会轻松地占用你可用的每个CPU上的每个核心。你不会花时间在线程同步或其他愚蠢的事情上。
这种方法对于“CPU密集型”应用程序非常有效。
你可以直接使用Python 多进程,它镜像了线程的 API 但运行在独立的进程中。可能不支持非 POSIX 系统。对于一般的 CPU 密集型问题,你也可以尝试 Stackless Python(已经提到过)或者 Pyrex。