python eventlet绿化和patch原理

作者:妙音 时间:2022-02-22 11:10:14 

说明

eventlet是一个必备工具,经常用,绿化原理有点忘记了,重新复习一遍.

三个主要问题 

1. 绿化的原理是什么?
2. 绿化怎么管理?
3. 绿化怎么引入?

绿化原理

利用select/epolls/kqueue等操作系统提供的非阻塞操作,将阻塞改为非阻塞.

引用管理 

eventlet在import之后,将模块中的属性绿化.
用一小段代码来查看看


import sys
import eventlet
# eventlet.monkey_patch()

httplib2 = eventlet.import_patched('httplib2')
print(httplib2)
print(httplib2.socket)

print("================")
for k,v in sys.modules.items():
 if "socket" in k:
   print(k, v)

# 打印内容
<module 'httplib2' from 'D:\\workspace\\venv\\xxx\\lib\\site-packages\\httplib2\\__init__.py'>
<module 'eventlet.green.socket' from 'D:\\workspace\\venv\\xxx\\lib\\site-packages\\eventlet\\green\\socket.py'>
================
_socket <module '_socket' from 'c:\\python\\python36\\DLLs\\_socket.pyd'>
socket <module 'socket' from 'c:\\python\\python36\\lib\\socket.py'>
__original_module_socket <module 'socket' from 'c:\\python\\python36\\lib\\socket.py'>

# 说明了什么?
绿化只是替换httplib2模块中的引用属性socket。并未改变sys.modules中的属性

引入绿化方法一:直接import


from eventlet.green import socket

引入绿化方法二:eventlet.import_patch 

1.好处: 能绿化模块内部的系统模块
2.只能绿化os, select, socket, thread, time, psycopy, MySQLdb, bultines, subprocess
3.如果是import threading,不会自动绿化, 需要from eventlet.green import threading


import eventlet
httplib2 = eventlet.import_patched('httplib2')
print(httplib2)
print(httplib2.socket)
 
# 打印
<module 'httplib2' from 'D:\\workspace\\venv\\autumn-secs\\lib\\site-packages\\httplib2\\__init__.py'>
<module 'eventlet.green.socket' from 'D:\\workspace\\venv\\autumn-secs\\lib\\site-packages\\eventlet\\green\\socket.py'>

引入绿化方法三:eventlet.monkey_patch

1.与import_patch不同,会直接修改sys.modules
2.但是也只能绿化os,select等等几个模块,其它模块需要用直接引用绿化

来源:http://yongqing.is-programmer.com/posts/215593.html

标签:python,eventlet,绿化,patch
0
投稿

猜你喜欢

  • 史上最简单的MySQL数据备份与还原教程(下)(三十七)

    2024-01-25 06:03:33
  • Python3.7 dataclass使用指南小结

    2023-10-02 13:36:14
  • 如何“看看”服务器上的那个文件还在不在?

    2009-11-02 20:17:00
  • python3.5 tkinter实现页面跳转

    2022-08-03 22:23:46
  • 利用python实现全屏爱心雨向喜欢的人表白

    2022-05-29 22:32:14
  • Golang限流库与漏桶和令牌桶的使用介绍

    2024-05-10 13:57:50
  • pytorch实现mnist分类的示例讲解

    2022-03-30 09:17:19
  • 一文了解Django缓存机制

    2023-08-18 06:34:21
  • 使用TFRecord存取多个数据案例

    2023-07-14 22:26:34
  • Python 序列的方法总结

    2021-12-12 11:14:23
  • Python读取和存储yaml文件的方法

    2023-03-26 10:23:44
  • 深入理解Python 多线程

    2021-03-25 05:25:28
  • Python Numpy 自然数填充数组的实现

    2023-12-18 16:51:37
  • TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现

    2023-02-14 17:08:47
  • python多线程之事件Event的使用详解

    2022-12-21 11:46:10
  • python定时器(Timer)用法简单实例

    2021-01-10 15:43:04
  • javascript闭包的秘密

    2008-09-28 20:39:00
  • 深入分析C#连接Oracle数据库的连接字符串详解

    2024-01-20 23:46:29
  • MySQL数据备份之mysqldump的使用方法

    2024-01-17 05:25:46
  • 解决mysql ERROR 1045 (28000)-- Access denied for user问题

    2024-01-24 01:30:43
  • asp之家 网络编程 m.aspxhome.com