Python的tasklet是不是违反了没有"GOTO"的规则?

Krz*_*nde 3 python concurrency green-threads python-stackless

我已经对Stackless Python的tasklets进行了大量的谷歌研究.每个来源都提到它作为一个主题

stackless.com:Microthreads:tasklets包装函数允许它们作为微线程启动.

disinterest.orgv:Tasklets - 轻量级线程

但是,tasklet并不简洁.它们执行部分代码.

像这样的代码:

def function(n):
   print n
   print n
   stackless.schedule()

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()
Run Code Online (Sandbox Code Playgroud)

会打印

3
3
10
10
Run Code Online (Sandbox Code Playgroud)

tasklet执行代码直到遇到stackless.schedule()然后它从开始或从最后一次暂停的位置开始执行下一个tasklet.

每个程序员都知道"没有GOTO"的黄金法则.我的问题是:

这和GOTO有什么不同?
如果没有并行执行tasklet,有什么好处?
为什么每个消息来源都提到它们作为线程替代品,如果它们不是真正的线程?

uni*_*rio 7

它和goto有什么不同?

这与goto的不同之处在于你没有指明你要去的地方.通过让你的tasklet(调用stackless.schedule()),你所说的只是"我现在已经完成了;你可以稍后再回到我身边",而不是"从文件x的第n行开始执行"."goto is bad"的建议源于这样一个事实:它允许你编写意大利面条代码,在那里你的程序执行是不可能的.另一方面,Tasklets(或协同程序)在这方面要好得多,因为您知道每个tasklet都将运行完成.

如果没有并行执行tasklet,有什么好处?

并发性与并行性不同.并行性是两个任务同时运行的时候.并发是指两个任务在执行时可能重叠,但它们可能不一定都在同一时刻运行.Tasklet是并发的但不是并行的.tasklets的优点基本上是并发性.

为什么每个消息来源都提到它们作为线程替代品,如果它们不是真正的线程?

如果你可以放弃并行性,它们是线程替代,以便获得更低的开销.它们仍然是线程,因为它们仍然允许多个并发执行路径,即使它们不是严格并行的.