python gevent实现机制

之前看的greenlet只是提供了基本的coroutine的作用,是最小的执行单元.但是要想使用,还需要提供一个调度器,来调度什么时候哪些greenlet应该执行.所以看了一下gevent的实现,当前的稳定版本使用的是libev.libevent的一种替代方案.性能上更优越一些.libev支持很多事件类型,但是最常用的是io和timer类型的.io类型的通过系统提供的相关系统调用实现(linux下是epoll),timer类型的通过维护一个最小堆实现. 
看一下下面的代码: 

Python代码  

import gevent  from gevent import monkey  monkey.patch_all()    def download():      import urllib2      urllib2.urlopen('http://www.google.com/').read()    c = gevent.spawn(download)  gevent.joinall([c])

登录后复制

gevent通过spawn创建并启动一个greenlet,此greenlet执行函数为download.启动这个greenlet是通过把这个greenlet加入到libev的prepare callback里面.libev在每次执行事件循环的时候都会调用prepare callback里面的函数,执行后把里面的callback清除掉.这样就能保证每次spawn的greenlet有执行的机会.并且只会执行一次. 
在这个greenlet执行urlopen以及read的时候,因为涉及到io操作(socket.[send|recv]),gevent通过monkey patch把这些函数进行了封装,当调用相关的操作时就会创建一个对应fd的watcher加入到libev的事件列表里面. 
当有相关的读写事件发生时,会触发相应的callback.相关的callback会调用greenlet的switch进行coroutine的切换. 
通过上面的方式greenlet达到了调度器的目的.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2281594.html

(0)
上一篇 2025年2月27日 18:46:07
下一篇 2025年2月19日 10:37:05

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • from module import 和 import 的区别

    最近在用codecademy学python,遇到一些题目错误,小小记录一下  如from math import sqrt是把sqrt作为本文件的方法导入进来了,使用的时候只需要直接调用sqrt。 而如果import是import math…

    编程技术 2025年2月27日
    200
  • 短URL生成转换

    主要逻辑: 1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 62 2, 初始化L**N个整数,并作为一个序列push到redis里 3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I…

    编程技术 2025年2月27日
    200
  • python greenlet 实现机制

    最近使用python开发web程序,一直使用的是fastcgi模式.然后每个进程中启动多个线程来进行请求处理.这里有一个问题就是需要保证每个请求响应时间都要特别短,不然只要多请求几次慢的就会让服务器拒绝服务,因为没有线程能够响应请求了.平时…

    编程技术 2025年2月27日
    200
  • 详解python的数字类型变量与其方法

    前言 python数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。下面话不多说,来看看详细的介绍吧。 以下实例在变量赋值时 Number 对象将被创建: var1 = 1var2 = 10 登录后…

    编程技术 2025年2月27日
    200
  • python_bisect模块的使用

    这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisect_lef…

    编程技术 2025年2月27日
    200
  • python数组查找算法bisect二分查找插入

    1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisec…

    编程技术 2025年2月27日
    200
  • Python 二分查找与 bisect 模块

    python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为o(n)。对于大数据量,则可以用二分查找进行优化。二分查找要求对象必须有序,其基本原理如下: 1.…

    编程技术 2025年2月27日
    200
  • Python pass详细介绍及实例代码

    python pass的用法: 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/Java中: 立即学习“Python免费学习笔记(深入)”; if(true);  //do nothingelse{ …

    编程技术 2025年2月27日
    200
  • python与编码

    Python中的文字对象 python 3.x中处理文字的对象有str, bytes, bytearray。 bytes和bytearray可以使用除了用作格式化的方法(format, format_map)以及几个特殊的基于Unicode…

    编程技术 2025年2月27日
    200
  • python实现文件夹同步

    定义syndirtool类,用于同步两个文件夹的内容,从/usr/local/a文件夹到/usr/local/b文件夹,执行方法: Python代码   python SynDirTool.py /usr/local/a  /usr/loc…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论