【python】gevent并发编程协程

1.简介

gevent是一个基于协程的Python网络库,它使用 greenlet在libev 或libuv事件循环之上提供高级同步API 。

功能包括:

  • 基于libev或libuv的快速事件循环。
  • 基于greenlets的轻量级执行单元。
  • 重用Python标准库中的概念的API(例如,有事件和 队列)。
  • 具有SSL支持的协作套接字
  • 通过线程池,dnspython或c-ares执行的协作DNS查询。
  • 猴子修补实用程序,以使第三方模块合作
  • TCP / UDP / HTTP服务器
  • 子流程支持(通过gevent.subprocess)
  • 线程池

2.gevent安装

pip install gevent

3.下面看一个例子

# -*- coding: utf-8 -*-
import datetime
import gevent
from gevent import monkey; monkey.patch_socket()

def func(hello_world_num):
    print("-------begin  func-------") 
    for j in range(hello_world_num):
       print('gevent: %s,  ======  j:%d, hello world!'% (gevent.getcurrent(),j))
       #gevent.sleep(0)
    print("-------end  func-------")    
  
def gevent_func(gevent_num,hello_world_num):
    gevents=[]
    a=datetime.datetime.now()
    for num in range(gevent_num):
        g1 = gevent.spawn(func, hello_world_num)
        gevents.append(g1)
    gevent.joinall(gevents) 
    b=datetime.datetime.now()
    print('start time:%s,end time:%s,use time:%s'% (a,b,(b-a)))

#####调用事例#####       
    
#协程数
gevent_num=3
#任务循环数
hello_world_num=5

gevent_func(gevent_num,hello_world_num)

来看一下执行结果(从结果里可以看出,每个协程执行顺序都是01234,一个协程执行完后才会进入下一个):
在这里插入图片描述

4. 同步和异步执行

(1)并发的核心思想是,可以将更大的任务分解为一组子任务,这些子任务被安排为同时或异步运行,而不是一次一个或同步运行。两个子任务之间的切换称为上下文切换。

(2)如果把上面的hello_world_num循环次数改为500000,让它们的运行时间长一点,然后在操作系统的进程管理器中看,线程数只有1个。

(3)一般我们采用gevent+多进程 处理高并发的操作,提升效率

(4)gevent中的上下文切换是通过yielding完成的。在这个例子中,我们通过 gevent.sleep(0)来切换上下文。

5.还是上面的例子 ,加gevent.sleep(0)看下效果

在这里插入图片描述
执行结果如下(和不加切换操作相比,协程间交替运行):
在这里插入图片描述

6.详细教程网址

http://sdiehl.github.io/gevent-tutorial/
http://www.gevent.org/intro.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章