有许多与Stackless Python相关的问题。但是没有人回答我的问题,我想(如果错了,请纠正我!)一直有一些关于它的议论,所以我好奇地想知道。我要用Stackless做什么?它有什么比CPython更好的?
是的,它有绿色线程(stackless),只要没有阻塞的操作,就可以快速创建许多轻量级线程(就像Ruby的线程?)。这有什么用呢?它还有哪些我想在CPython上使用的特性?
发布于 2010-02-12 09:15:33
它允许你处理大量的并发。任何理智的人都不会创建十万个系统线程,但是你可以使用stackless来实现。
本文测试了如何使用Python和Google Go (一种新的编程语言)创建10万个微线程:http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html
令人惊讶的是,即使Google Go被编译成本机代码,并且他们吹嘘他们的协同例程实现,Python仍然获胜。
Stackless可以很好地实现map/reduce算法,在这种算法中,您可以根据输入数据拥有非常多的reduce。
发布于 2010-02-08 18:58:20
Stackless Python的主要优点是支持非常轻量级的协程。CPython本身并不支持协程(尽管我希望有人在评论中发布基于生成器的攻击),所以当你遇到从协程中受益的问题时,Stackless是对CPython的一个明显的改进。
我认为它们的主要优势是当你的程序中有许多并发任务运行时。示例可能是为其AI运行循环脚本的游戏实体,或者是为许多客户端服务的web服务器,这些客户端的页面创建速度很慢。
然而,对于共享数据,您仍然存在许多关于并发正确性的典型问题,但是确定性任务切换使编写安全代码变得更容易,因为您确切地知道控制权将被转移到哪里,从而知道共享状态必须是最新的确切位置。
发布于 2010-02-12 20:50:28
Thirler已经提到在Eve Online中使用了stackless。记住,这一点:
(..)stackless允许将任务分成更小的任务Tasklet,然后可以从主程序中分离出来独立执行,这进一步增加了这一点。这可用于即发即忘任务,如发送电子邮件或调度事件,或用于IO操作,如发送和接收网络数据包。一个微线程等待来自网络的数据包,而其他微线程继续运行游戏循环。
它在某些方面类似于线程,但它是非抢占式的,并且是显式调度的,因此同步问题较少。此外,在微线程之间切换要比线程切换快得多,而且您可以拥有大量的活动微线程,而线程的数量受到计算机硬件的严重限制。
(引用自here)
在2009年的PyCon上,有一个a very interesting talk,描述了为什么以及如何在CCP游戏中使用Stackless。
此外,还有一个非常好的introductory material,它描述了为什么stackless对于您的应用程序是一个很好的解决方案。(它可能有点老了,但我认为它值得一读)。
https://stackoverflow.com/questions/2220645
复制相似问题