【问题标题】:how stackless python can be fast for concurrency?无堆栈python如何快速并发?
【发布时间】:2009-12-06 03:48:23
【问题描述】:

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

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

看,如果使用单线程函数调用没有锁应该和stackless python一样高效

【问题讨论】:

  • 投票结束。您还没有提出我们可以回答的适当、具体的问题。修改你的问题,减少漫无边际的咆哮,或者问一些具体的问题。
  • 我更正了,希望这次能让我自己理解

标签: python concurrency stackless python-stackless


【解决方案1】:

首先关注功能,其次才是性能(除非您知道自己有需要)。

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

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

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

有很多选择,但除非您处理的是big big,否则您很可能会采用简单的方法。

尽早发布,经常发布。

【讨论】:

  • 感谢您给我建议,即使我最初的问题是如此广泛:P
  • -1:Eve Online 怎么样,他们使用 Erlang 来管理他们的 Python 进程吗?我觉得这部分没什么帮助,总体而言,答案只包含随机的点点滴滴。
  • @nikow - 您是否知道答案是针对在您发表评论前 5 小时编辑的一个截然不同的问题?这更像是对先前徘徊的问题的建议回应。除非我错误陈述了事实或给出了不好的建议,否则不要看到投反对票的原因。
【解决方案2】:

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

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

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

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

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

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

但通常消息传递方法是一种更简洁、容易正确的版本。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2010-10-30
    • 2021-01-19
    相关资源
    最近更新 更多