博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
switch函数——Gevent源码分析
阅读量:6451 次
发布时间:2019-06-23

本文共 1384 字,大约阅读时间需要 4 分钟。

在gevent的源码中,经常能看到switch函数。而不同的类中的switch函数有不同的用法

1. greenlet的switch函数

这里面的greenlet是greenlet库中的greenlet类,它是gevent中的Greenlet类的基类(即Greenlet类是在greenlet类的基础之上的扩展)

在这个基类里面,它的switch函数的作用是:==切换到这个greenlet协程中,并执行该协程的任务==

  1. 如果这个协程的任务并没有被激活过,则执行self.run函数来执行这个协程的任务
  2. 如果已经被激活,而且正在运行这个协程的任务(即在执行run函数的时候切到了另一个协程中),调用switch函数将回到这个协程的状态(即上次运行的地点)

2. hub的switch函数

首先,主协程hub类继承了greenlet库的greenlet类。下面是hub的switch函数源码:

def switch(self):    switch_out = getattr(getcurrent(), 'switch_out', None)    if switch_out is not None:        switch_out()    return greenlet.switch(self)

return greenlet.switch(self)这句说明了这个switch函数将返回greenlet类的switch方法(也就是第一类switch,分两种情况: 执行过要切换的协程的run函数,和未执行run),从而实现切换到子协程并执行其任务的作用(即在hub实现协程的切换)

3. Waiter的switch函数

Waiter的switch函数只能被主协程hub调用

以下是switch的源码:

def switch(self, value=None):    """Switch to the greenlet if one's available. Otherwise store the value."""    greenlet = self.greenlet    if greenlet is None:        self.value = value        self._exception = None    else:        assert getcurrent() is self.hub, "Can only use Waiter.switch method from the Hub greenlet"        switch = greenlet.switch        try:            switch(value)        except:            self.hub.handle_error(switch, *sys.exc_info())

这个switch的作用是切换到可用的协程greenlet的上次执行的地点和状态(也就是上面第一种switch被调用的时候,这个协程已经执行了run函数,则回到上次执行的状态,继续执行),否则就保存value值

转载于:https://www.cnblogs.com/eric-nirnava/p/4614540.html

你可能感兴趣的文章
linux 脚本map,Linux Shell Map的用法详解
查看>>
如何在linux系统下配置共享文件夹,如何在windows和Linux系统之间共享文件夹.doc
查看>>
thinkpad装linux无线网卡驱动,ThinkPad E530 Fedora 20 下无线网卡驱动的安装
查看>>
linux操作系统加固软件,系统安全:教你Linux操作系统的安全加固
查看>>
linux中yum源安装dhcp,24.Linux系统下动态网络源部署方法(dhcpd)
查看>>
linux屏幕复制显示出来的,linux – stdout到gnu屏幕复制缓冲区
查看>>
一起学Shell(十)之可称植性议题与扩展
查看>>
部署Ganglia监控Hadoop&Hbase
查看>>
gitlab的用户使用手册
查看>>
论Optimizer的工作模式ALL_ROWS&FIRST_ROWS
查看>>
生产环境高并发MySQL SQL语句优化案例
查看>>
Lync 小技巧-24-PDF 加密文件-转-Word-操作手册
查看>>
ASP.NET性能优化之分布式Session
查看>>
TaffyDB Introduction
查看>>
转载:《TypeScript 中文入门教程》 16、Symbols
查看>>
JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记4
查看>>
C#技术------垃圾回收机制(GC)
查看>>
漫谈并发编程(三):共享受限资源
查看>>
【转】github如何删除一个仓库
查看>>
Linux系统编程——进程调度浅析
查看>>