首页 > 编程语言 >python编程(gevent入门)

python编程(gevent入门)

时间:2022-11-23 13:01:10浏览次数:54  
标签:f1 f2 python 编程 t2 t1 gevent import


    大家都知道python脚本执行的时候不是很快,特别是python下面的多线程机制,长久以来一直被大家所诟病。所以,很多同学都在思考python下面有没有什么方法可以让python执行地更快一些。其中这些方法包括:1、将复杂的代码转由c完成;2、多进程并发执行;3、用多线程完成io操作等等。另外,这几年,大家讨论最多的大概还是gevent协程机制。

1、协程的基本原理

    gevent的基本原理来自于libevent&libev。熟悉c语言的同学对这么一个lib应该不陌生。本质上libevent或者说libev都是一种事件驱动模型。这种模型对于提高cpu的运行效率,增强用户的并发访问非常有效。但是因为它本身是一种事件机制,所以写起来有点绕,不是很直观。所以,为了修正这个问题,有心人引入了用户侧上下文切换的机制。这就是说,如果代码中引入了带io阻塞的代码时,lib本身会自动完成上下文的切换,全程用户都是没有觉察的。这就是gevent的由来。

2、gevent安装

    ubuntu下面可以直接用apt-get安装gevent库。

sudo apt-get install python-gevent

3、gevent入门

    为了说明gevent的使用方法,我们可以看一段简单的代码,

import gevent

def f1():
for i in range(5):
print 'this is ' + str(i)
gevent.sleep(0)

def f2():
for i in range(5):
print 'that is ' + str(i)
gevent.sleep(0)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

    通过打印输出,可以看出f1和f2是交叉打印信息的,因为在代码执行的过程中,由用户自己主动调用了切换函数。

4、延时操作

    关于延时,我们只需要将上面的代码修改一下,即将sleep时间变长即可,

import gevent

def f1():
for i in range(5):
print 'this is ' + str(i)
gevent.sleep(3)

def f2():
for i in range(5):
print 'that is ' + str(i)
gevent.sleep(3)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

5、锁操作

    虽然是协程,但是在里面添加锁增加对共享资源的互斥访问也是非常重要的,此外锁本身的添加也是很简单的,

import gevent
from gevent.lock import Semaphore

sem = Semaphore(1)

def f1():
for i in range(5):
sem.acquire()
print 'this is ' + str(i)
sem.release()

def f2():
for i in range(5):
sem.acquire()
print 'that is ' + str(i)
sem.release()

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

6、延时和锁

    大家可以看一下如果锁和延时一起使用,会怎么样?

import gevent
from gevent.lock import Semaphore

sem = Semaphore(1)

def f1():
for i in range(5):
sem.acquire()
print 'this is ' + str(i)
sem.release()
gevent.sleep(2)

def f2():
for i in range(5):
sem.acquire()
print 'that is ' + str(i)
sem.release()

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

7、gevent下的monkey机制

    要是gevent说到这里,只能算的上还行。我个人觉得gevent另外一个特别厉害的功能就是它的monkey机制。简单来说,假设你不愿意修改原来已经写好的python代码,但是又想充分利用gevent机制,那么你就可以用monkey来做到这一点。你所要做的就是在文件开头打一个patch,那么它就会自动替换你原来的thread、socket、time、multiprocessing等代码,全部变成gevent框架。这一切都是由gevent自动完成的。注意这个patch是在所有module都import了之后再打,否则没有效果。

from gevent import monkey; monkey.patch_all()
import gevent

8、其他资料

    关于gevent,建议大家多看看英文第一手资料。比如​​官网​​​、还有​​这里​​。


标签:f1,f2,python,编程,t2,t1,gevent,import
From: https://blog.51cto.com/feixiaoxing/5881018

相关文章

  • python编程(巧用装饰器)
        以前没有用过装饰器,也不知道它有什么用。直到最近写了一个log函数,在直到原来python的装饰器可以这么方便。1、原来debug消息的写法    假设有一个process函数,......
  • python编程(类变量和实例变量)
        关于类变量和实例变量,一直不是很清楚。所以,想做几个实验,彻底解决这个问题。为此,我们设计了三个实验。1、直接引用类变量importosimportsysclassA():data=1......
  • python编程(python和c相互调用)
      通常为了扩展python的功能,我们需要将c库移植到python上面。python和c调用一般分成两种情况,一种是python调用c,这种情况最为普遍,也比较简单。另外一种就是c调用python,这......
  • 21.1 动态TLS--《Windows核心编程》
    应用程序通过调用一组4个函数来使用动态TLS,这些函数实际上最经常为DLL所使用。通常情况下,如果DLL使用TLS,那么当它用DLL_PROCESS_ATTACH标志调用它的DllMain函数时......
  • 21.2 静态TLS--《Windows核心编程》
    部分笔记来自于:https://blog.csdn.net/Steven_programe_life/article/details/103358251?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baiduland......
  • socket通信编程C++实现
    socket提供了套接字,以方便我们想读取文件一样进行网络进程间的数据通信。在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文......
  • 20.3 DLL入口函数--《Windows核心编程》
    如果在执行一些与进程或者线程有关的初始化或者销毁工作的时候,需要DllMain。如果只需要创建一个包含资源的DLL,不需要这个函数。B00LWINAPIDllMain(HINSTANCEhinstDll,......
  • 20.4 延迟加载DLL--《Windows核心编程》
    延迟加载的DLL是个隐含链接的DLL,它实际上要等到你的代码试图引用DLL中包含的一个符号时才进行加载。DLL延迟加载技术的原理,就是从导入表中去掉某dll这一项,等到正式调......
  • 20.5 函数转发器/已知的DLL/DLL重定向/模块的基地址重定位--《Windows核心编程》
    一、函数转发器函数转发器是DLL的输出节(导出段)中的一个项目,用于将对一个函数的调用转至另一个DLL中的另一个函数。可以在DLL中使用函数转发器:#pragmacomment(link......
  • 西门子1200,1500,300,400PLC编程软件,西门子博途博图TIA 13 V14 V15 V16 V17安装包。
     西门子博途博图TIA13V14V15V16V17安装包,西门子1200,1500,300,400PLC编程软件,永久使用。 下载安装包......