Python tornado协程函数中的变量会发生什么变化?

Python tornado协程函数中的变量会发生什么变化?,python,python-3.x,tornado,coroutine,tornado-motor,Python,Python 3.x,Tornado,Coroutine,Tornado Motor,我对非阻塞IO的概念还不熟悉,但我很难理解—关于协程。考虑这个代码: class UserPostHandler(RequestHandler): @gen.coroutine def get(self): var = 'some variable' data = json.loads(self.request.body) yield motor_db.users.insert({self.request.remote_ip: da

我对非阻塞IO的概念还不熟悉,但我很难理解—关于协程。考虑这个代码:

class UserPostHandler(RequestHandler):
    @gen.coroutine
    def get(self):
        var = 'some variable'
        data = json.loads(self.request.body)
        yield motor_db.users.insert({self.request.remote_ip: data})#asynch non blocking db insert call
        #success
        self.set_status(201)
        print var
调用
get
函数时,它会创建字符串
var
。当函数等待电机插入完成时,该变量会发生什么变化?据我所知,“非阻塞”意味着没有线程在等待IO调用完成,也没有内存在等待时被使用。那么
var
的值存储在哪里?恢复执行时如何访问它


任何帮助都将不胜感激

执行
insert
时,
var
的内存仍在使用,但是
get
函数本身被“冻结”,这允许其他函数执行。Tornado的协程是使用Python生成器实现的,它允许在出现
屈服时暂停函数执行,然后在屈服点后重新启动(保留函数状态)。以下是在中对行为的描述:

如果遇到yield语句,则函数的状态为 冻结,并将值[yield]返回给.next()的调用方。通过 “冻结”我们的意思是保留所有当地州,包括 局部变量、指令指针和 内部计算堆栈:保存足够的信息,以便 下次调用.next()时,函数可以像 收益率报表只是另一个外部调用


@gen.coroutine
生成器具有与Tornado的事件循环相关联的魔力,因此
插入
调用返回的
未来
将注册到事件循环中,从而允许
获取
生成器在
插入
调用完成时重新启动。

@WeaselFox Cool!如果你对细节感兴趣,你应该看看。它需要一些时间来消化,但(至少在我看来)是非常有趣的东西。简短的版本是,它存储在
get
的堆栈框架中,就像在普通函数中一样。协同例程和子例程之间的关键区别在于堆栈帧实际上不必在堆栈中,它们在移交控制时被“搁置”在一边;它们只是堆上的值的名称。所以唯一被“存储”的是局部变量#1是对某个特定对象的引用。