2

无堆栈 python 没有很好地使用多核,那么它​​应该比 python 线程/多处理更快的点在哪里?

所有的 benchmark 都使用 stackless python tasklet 与 python 线程锁和队列进行比较,这是不公平的,因为锁总是效率低下

看,如果使用不带锁的单线程函数调用,它应该和无堆栈 python 一样高效

4

2 回答 2

2

首先关注功能,然后再关注性能(除非您知道自己有需要)。

服务器上的大部分时间都花在 I/O 上,因此多核并没有太大帮助。如果您使用的主要是I/O,那么多线程 python 可能是最简单的答案。

如果服务器请求是 CPU 密集型的,那么拥有一个父进程(无论是否多线程)和相应的子进程确实很有意义。

如果你真的想扩展,你可以看看不同的平台,比如 Erlang。如果您真的想扩展并仍然使用 python,您可以查看分布式 erlang,其中 Python 进程作为分布式集群上的 Erlang 端口进行管理。

有很多选择,但除非你正在处理一些的东西,否则你很可能会采取一种简单的方法。

早发布,经常发布。

于 2009-12-06T04:17:41.700 回答
0

有一个新的和流行的东西叫做异步 IO 循环和消息传递并发以及其他一些流行的术语。好吧,它一点也不新鲜,但只是最近 5 年才被主流发现。

Stackless Python 是 Python 的一个版本,其中 VM 本身已被修改以更好地支持这些消息传递和 IO 循环,其技巧是绿色线程/协程。

在 Python 上还有其他库可以用不同的工具来做同样的事情,例如 Twisted 和 Tornado。你甚至可以在 Stackless Python 等上运行混合 Twisted。

IO 循环位直接映射到 Berkley 套接字如何执行异步 IO,并且通过一些努力可以扩展为主动而不是被动,并与文件系统和网络套接字一起使用,例如最新的 libevent。

要横向扩展以利用多个内核,您有两种方法 -多线程;共享状态,例如线程或进程之间 -多处理,例如消息队列。当前架构的一个普遍限制是线程方法适用于本地的大量内核,而当内核数量变得庞大或这些内核位于不同的机器上时,消息传递在性能方面会超过性能。您可以采用混合方法。

由于 Python VM 中的内部设计选择,它在多线程方面的效率通常不如多处理,因此您可以比在其他平台上更快地通过消息传递进入多个进程。

但通常消息传递方法是一个更干净、更容易正确的版本。

还有其他基于相同方法的其他语言具有不同的附加目标和约束,例如 Erlang、node.js、Clojure、Go。

其中,Clojure 可能是信息量最大的。当您了解 Clojure 的运行方式并仔细考虑其中的原因时,其他系统的整个目标和约束就会落实到位......

于 2010-11-19T06:39:24.880 回答