Python tornado协程函数中的变量会发生什么变化?
我对非阻塞IO的概念还不熟悉,但我很难理解—关于协程。考虑这个代码: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
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是对某个特定对象的引用。