有很多与 Stackless Python 相关的问题。但我认为没有人回答我的问题(如果错误请纠正我!)。一直有一些关于它的传闻,所以我很想知道。我将使用 Stackless 做什么?它比 CPython 好在哪里?

是的,它有绿色线程(无堆栈),只要没有操作被阻塞,就可以快速创建许多轻量级线程(类似于 Ruby 的线程?)。这有什么用呢?我想通过 CPython 使用它还有哪些其他功能?

有帮助吗?

解决方案

它可以让你有大量并发的工作。没有人会理智创造十万系统线程,但你可以做到这一点使用无堆栈。

本文的测试正是这样做的,在Python和谷歌围棋(一种新的编程语言)创造十万任务蕾:的 http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

出人意料的是,即使谷歌走的是编译为本地代码,和他们吹嘘他们的合作程序实现,Python的仍然赢了。

无堆栈将有利于实现的map / reduce算法,在这里您可以根据您输入的数据有非常大量的减速器。

其他提示

Stackless的Python的主要好处是非常轻量级的协同程序的支持。 CPython的不支持本地协同程序(虽然我希望有人张贴在评论基于发电机黑客),所以无堆栈是CPython的一个明显的改善,当你有,从有利于协同程序问题。

我觉得他们擅长的主要领域是当你有你的程序中运行多个并行任务。例子可能是运行循环脚本的AI游戏实体,或者是服务于许多客户是慢来创建页面的Web服务器。

您还是有很多然而对于共享数据的并发正确性的典型问题,但确定的任务切换可以更容易地编写安全的代码,因为你知道确切位置,控制将被转移,因此知道该共享的确切点状态必须是最新的。

Thirler 已经提到过《星战前夜》中使用了 stackless。请记住:

(..) stackless 对此做了进一步的改进,它允许将任务分成更小的任务(Tasklet),然后可以将它们从主程序中分离出来单独执行。这可用于“即发即忘”任务,例如发送电子邮件、分派事件,或用于 IO 操作,例如发送和接收网络数据包。一个小任务等待来自网络的数据包,而其他小任务则继续运行游戏循环。

它在某些方面类似于线程,但它是非抢占式的并且是显式调度的,因此同步问题较少。此外,微线程之间的切换比线程切换快得多,并且您可以拥有大量活动的微线程,而线程的数量受到计算机硬件的严格限制。

(此引文来自 这里)

在 PyCon 2009 上给出了 一个非常有趣的谈话, ,描述了 CCP Games 使用 Stackless 的原因和方式。

另外,还有一个非常好的 介绍材料, ,它描述了为什么 stackless 是您的应用程序的一个很好的解决方案。(可能有些老了,但我认为值得一读)。

星战前夜在无堆栈的Python很大程度上编程。他们对使用它的几个开发博客。它似乎它是高性能计算非常有用的。

虽然我没有用无堆栈本身,我已经使用Greenlet用于实现高并发网络应用程序。一些用例林登实验室已经把对分别是:高性能的智能代理,为分布在机器的庞大的数字命令的快速系统,并做一吨数据库的写入和读取(在约1:1的比例应用:2,这是非常写重,所以它的花费大部分时间等待数据库返回),和网络爬行器型的东西用于内部网络的数据。基本上就期望任何应用都要做大量的网络I / O将能够创建一个bajillion轻量级线程受益。万个连客户似乎并不像一个巨大的交易给我。

无堆栈或Greenlet是不是一个真正的完整的解决方案,虽然。他们是非常低的水平,你将不得不做很多monkeywork的建立与他们使用它们,以最充分的应用。我知道这是因为我认为,提供Greenlet顶部的网络和调度层,特别是因为编写应用程序是它容易得多库。有一帮这些现在的;我保持Eventlet,也有竞合,手,大概多了一些,我不知道。

如果你想写像什么,我写了一篇关于声音的那种应用程序,考虑这些图书馆之一。无堆栈的VS Greenlet的选择比决定什么库最适合你想要做什么,需要多少有些不太重要。

有关绿色线程的基本用途,我看到它的方式,是落实在其中有大量是做高延迟操作对象的系统。一个具体的例子将与其他机器进行通信:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

线程让你写上面的代码自然,但是如果对象的数量足够大时,线程就不能充分地进行。但是你可以在真正大量使用绿色线程甚至对。上述request_information()可以转出到一些地方的调度等工作正在等待,稍后再回来。你得到的能够称之为“阻塞”功能的好像他们立即返回的不使用线程的所有好处。

如果你想在一个简单的方法来写代码这显然是任何类型的分布式计算的非常有用的。

这也是有趣为多个内核以减轻等待锁:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

green_lock功能将基本上试图获取锁,只是转出到主调度如果失败由于其他核使用对象。

再次绿色线程正被用来减轻阻塞,从而允许代码被写入自然,并且仍然表现良好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top