不是';t Python微线程打破了“不”的规则;后藤;?

不是';t Python微线程打破了“不”的规则;后藤;?,python,concurrency,python-stackless,green-threads,Python,Concurrency,Python Stackless,Green Threads,我在谷歌上对Stackless Python的Tasklet做了大量研究。 每个消息来源都把它作为一个线程来引用 但微线程并不一致。他们一部分一部分地执行代码 代码如下: def function(n): print n print n stackless.schedule() stackless.tasklet(function)(3) stackless.tasklet(function)(10) stackless.run() 将打印 3 3 10 10 tas

我在谷歌上对Stackless Python的Tasklet做了大量研究。 每个消息来源都把它作为一个线程来引用

但微线程并不一致。他们一部分一部分地执行代码

代码如下:

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

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()
将打印

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

每个程序员都知道“不去”的黄金法则。我的问题是:

这与GOTO有何不同?
如果不并行执行,则使用微线程有什么好处?
如果它们不是真正的线程,为什么每个来源都会提到它们作为线程的替代品呢?

它与goto有什么不同? 这与goto不同,因为您没有指定要去哪里。通过生成您的tasklet(调用
stackless.schedule()
),您所说的是“我现在完成了;您可以稍后再联系我”,而不是“从文件x的第n行开始执行”。“goto是坏的”的建议源于这样一个事实,即它允许您编写意大利面代码,而您的程序的执行是不可能遵循的。另一方面,微线程(或协同程序)在这方面要好得多,因为您知道每个微线程都将运行到完成

如果Tasklet不是并行执行,那么使用它们有什么好处? 并发性不同于并行性。并行性是指两个任务实际上同时运行。并发是指两个任务在执行过程中可以重叠,但它们不一定同时运行。微线程是并发的,但不是并行的。Tasklet的优点基本上是并发性

如果它们不是真正的线程,为什么每个来源都把它们作为线程的替代品?
如果您可以放弃并行性以获得更低的开销,那么它们是线程的替代方案。它们仍然是线程,因为它们仍然允许多个并发执行路径,即使它们不是严格并行的

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)()
它本质上是单核线程,每个线程可以决定何时将控制权交给另一个等待的任务

它与实时操作系统如何实现任务调度非常相似