Green the world :使用monkey_patch

本文介绍如何利用eventlet的monkey_patch对python的time模块进行绿化,以实现并发请求并避免阻塞,通过具体例子展示了fetch函数在带有time.sleep(1)时的执行流程,以及不使用monkey_patch时的阻塞情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eventlet的monkey_patch 用于绿化一些python的模块,看看下面的例子就明白了

urls = ["http://www.haha.mx/joke/1292935",
        "http://www.baidu.com"]
import eventlet
from eventlet.green import urllib2
import time


def fetch(url):
  try:
      print "opening0", url
      time.sleep(1)
      body = urllib2.urlopen(url).read()
      print "done with0", url
      return url, body
  except urllib2.HTTPError:
      return "",""
def fetch1(url):
  try:
      print "opening1", url
      body = urllib2.urlopen(url).read()
      print "done with1", url
      return url, body
  except urllib2.HTTPError:
      return "",""

eventlet.monkey_patch()
pool = eventlet.GreenPool(100)
pool.spawn(fetch,urls[0])
pool.spawn(fetch1,urls[1])
pool.waitall()
运行结果:
opening0 http://www.haha.mx/joke/1292935
opening1 http://www.baidu.com
done with1 http://www.baidu.com
done with0 http://www.haha.mx/joke/1292935
monkey_patch函数原型:
monkey_patch(os=None, select=None, socket=None, thread=None, time=None, psycopg=None)
程序中在pool中创建两个绿色线程用于处理fetch和fetch1,fetch和fetch1不同的是fetch中调用了time.sleep(1),并且使用eventlet.monkey_patch()对time模块进行了绿化,从运行结果可以看出,先处理的处理的fetch,不过在fetch函数用调用time.sleep(1)将运行权利交给了hub,然后接着执行fetch1,如果不使用monkey_patch的话time.sleep(1)会阻塞。这就是monke_patch的神奇之处,它在程序开始的时候调用相当于一个开关,而且可以通过monkey_patch的参数指定要绿化的模块。
分析这段代码library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity traffic_light_dual_road is Port ( clk : in STD_LOGIC; -- 外部555提供的1Hz时钟信号 flash_trigger : in STD_LOGIC; -- 用户按键,触发/停止黄灯闪烁模式 -- 主干道车辆倒计时接口 down : out STD_LOGIC; load : out STD_LOGIC; main_preset_high : out STD_LOGIC_VECTOR(3 downto 0); main_preset_low : out STD_LOGIC_VECTOR(3 downto 0); low_q : in STD_LOGIC_VECTOR(3 downto 0); high_q : in STD_LOGIC_VECTOR(3 downto 0); -- 支干道车辆倒计时接口 side_preset_high : out STD_LOGIC_VECTOR(3 downto 0); side_preset_low : out STD_LOGIC_VECTOR(3 downto 0); side_low_q : in STD_LOGIC_VECTOR(3 downto 0); side_high_q : in STD_LOGIC_VECTOR(3 downto 0); -- 主干道人行道倒计时接口 ped_down : out STD_LOGIC; ped_load : out STD_LOGIC; ped_main_preset_high : out STD_LOGIC_VECTOR(3 downto 0); ped_main_preset_low : out STD_LOGIC_VECTOR(3 downto 0); ped_low_q : in STD_LOGIC_VECTOR(3 downto 0); ped_high_q : in STD_LOGIC_VECTOR(3 downto 0); -- 支干道人行道倒计时接口 ped_side_preset_high : out STD_LOGIC_VECTOR(3 downto 0); ped_side_preset_low : out STD_LOGIC_VECTOR(3 downto 0); ped_side_low_q : in STD_LOGIC_VECTOR(3 downto 0); ped_side_high_q : in STD_LOGIC_VECTOR(3 downto 0) ); end traffic_light_dual_road; architecture Behavioral of traffic_light_dual_road is type state_type is (MAIN_GREEN, MAIN_YELLOW, SIDE_GREEN, SIDE_YELLOW, EMERGENCY); signal state : state_type := MAIN_GREEN; signal previous_state : state_type := MAIN_GREEN; -- 记录前一个状态 constant MAIN_GREEN_TIME : integer := 60; constant SIDE_GREEN_TIME : integer := 45; constant YELLOW_TIME : integer := 5;
最新发布
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值