首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python不是打破了"GOTO“的规则吗?

Python不是打破了"GOTO“的规则吗?
EN

Stack Overflow用户
提问于 2014-04-03 23:08:03
回答 2查看 241关注 0票数 3

我在google上做了一项关于无栈Python的大量研究。每个源都将其称为线程。

stackless.com :微线程:微线程包装函数,允许它们作为微线程启动。 disinterest.orgv: Tasklets轻量级线程

但工作小组并不同意。他们根据代码的一部分执行一个部分。

代码如下:

代码语言:javascript
复制
def function(n):
   print n
   print n
   stackless.schedule()

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()

将打印

代码语言:javascript
复制
3
3
10
10

一个微线程执行一个代码,直到它遇到stackless.schedule(),然后从开始执行下一个任务,或者从最后一个暂停的位置开始执行。

每个程序员都知道“不去”的金科玉律。我的问题是:

这和后藤有什么区别?

如果任务线程不是并行执行的,那么使用它们有什么好处呢?

如果它们不是真正的线程,为什么每个源都将它们作为线程来替代呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 23:35:22

它和后藤有什么不同?

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

如果任务线程不是并行执行的,那么使用它们有什么好处呢?

并发性不同于并行性。并行是两个任务同时运行的时候。并发性是指两个任务在执行过程中可能重叠,但它们可能不一定在完全相同的时刻运行。Tasklet是并发的,但不是并行的。tasklets的优点基本上是并发性。

如果它们不是真正的线程,为什么每个源都将它们作为线程来替代呢?

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

票数 7
EN

Stack Overflow用户

发布于 2014-04-03 23:36:18

我看不出这和goto想象下面的情况有什么相似之处。

代码语言:javascript
复制
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)()

它本质上是单个核心线程,每个线程都可以决定何时放弃对另一个等待任务的控制。

它非常简单地说明了实时操作系统如何实现任务调度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22850618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档