stackless python没有很好地利用多核,那么它应该比python线程/多处理更快点?
所有基准使用无堆栈python tasklet与python线程锁和队列进行比较,这是不公平的,导致锁总是效率低
看,如果使用单线程函数调用而不用锁定它应该像无堆栈python一样高效
答案 0 :(得分:2)
首先关注功能,然后关注性能(除非您知道自己有需要)。
服务器上的大部分时间都用在I / O上,因此多核对此没有多大帮助。如果你正在使用 I / O,那么多线程python可能是最简单的答案。
如果服务器请求是CPU密集型的,那么拥有一个父进程(无论是否是多线程的),以及相应的子进程确实很有意义。
如果你真的想扩展,你可以看一下不同的平台,比如Erlang。如果你真的想扩展并仍然使用python,你可以查看分布式erlang,其中Python进程在分布式集群上作为Erlang端口进行管理。
很多选项,但除非你正在处理某些大牌,否则你很可能采取一种简单的方法。
提前发布,经常发布。
答案 1 :(得分:0)
有一种新的和时髦的东西叫做异步IO循环和消息传递并发以及其他一些时髦的术语。嗯,它根本不是新的,但只是过去5年被主流发现。
Stackless Python是Python的一个版本,其中VM本身已被修改以更好地支持这些消息传递和IO循环,其技巧是绿色线程/协同程序。
还有其他库可以使用不同的工具执行相同的操作,例如: Twisted和Tornado,在Python上。你甚至可以在Stackless Python上运行混合Twisted等等。
IO循环位直接映射到Berkley套接字如何进行异步IO,并且通过一些努力可以扩展为主动而非被动,并且可以与文件系统以及网络套接字一起使用,例如:最新的解放。
要横向扩展以使用多个核心,您可以使用两种方法 - 多线程;共享状态例如线程或进程之间 - 多处理,例如消息队列。当前体系结构的一般限制是线程方法适用于本地的大量核心,而消息传递在性能方面超过核心数量变大或者这些核心位于不同机器上。你可以采取混合方式。
由于Python VM中的内部设计选择,它在多线程处理方面通常不如多处理那样高效,因此您可以比其他平台上的消息传递更快地进入多个进程。
但通常,消息传递方法更简洁,容易纠正版本。
还有其他语言建立在同一种方法的基础上,具有不同的附加目标和约束,例如: Erlang,node.js,Clojure,Go。
其中,Clojure可能是最具信息量的。当你了解Clojure如何滴答作响,并通过为什么进行思考时,其他系统的整体目标和约束将会落实到位......