我在google上做了一项关于无栈Python的大量研究。每个源都将其称为线程。
stackless.com :微线程:微线程包装函数,允许它们作为微线程启动。 disinterest.orgv: Tasklets轻量级线程
但工作小组并不同意。他们根据代码的一部分执行一个部分。
代码如下:
def function(n):
print n
print n
stackless.schedule()
stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()将打印
3
3
10
10一个微线程执行一个代码,直到它遇到stackless.schedule(),然后从开始执行下一个任务,或者从最后一个暂停的位置开始执行。
每个程序员都知道“不去”的金科玉律。我的问题是:
这和后藤有什么区别?
如果任务线程不是并行执行的,那么使用它们有什么好处呢?
如果它们不是真正的线程,为什么每个源都将它们作为线程来替代呢?
发布于 2014-04-03 23:35:22
它和后藤有什么不同?
这与goto不同,因为您没有指定要去哪里。通过生成您的tasklet (调用stackless.schedule()),您所要说的就是“我现在已经完成了;您可以稍后再联系我”,而不是“从文件x的第n行开始执行”。"goto是坏的“这个建议源于这样一个事实,即它允许您编写意大利面代码,在这种情况下,程序的执行是不可能遵循的。另一方面,tasklet (或coroutines)在这方面要好得多,因为您知道每个任务都会运行到完成。
如果任务线程不是并行执行的,那么使用它们有什么好处呢?
并发性不同于并行性。并行是两个任务同时运行的时候。并发性是指两个任务在执行过程中可能重叠,但它们可能不一定在完全相同的时刻运行。Tasklet是并发的,但不是并行的。tasklets的优点基本上是并发性。
如果它们不是真正的线程,为什么每个源都将它们作为线程来替代呢?
如果您可以放弃并行性,以获得较低的开销,则它们是线程的替代方案。它们仍然是线程,因为它们仍然允许多个并发执行路径,即使它们不是严格并行的。
发布于 2014-04-03 23:36:18
我看不出这和goto想象下面的情况有什么相似之处。
def Eat():
while True:
do_something()
stackless.schedule()
def Play():
while True:
do_another_thing()
stackless.schedule()
def Sleep():
while True:
do_something_else()
stackless.schedule()
stackless.tasklet(Eat)()
stackless.tasklet(Play)()
stackless.tasklet(Sleep)()它本质上是单个核心线程,每个线程都可以决定何时放弃对另一个等待任务的控制。
它非常简单地说明了实时操作系统如何实现任务调度。
https://stackoverflow.com/questions/22850618
复制相似问题