首页 > 科技 > python协程操作gevent实现多任务用法解析!(yield阻塞 greenlet)

python协程操作gevent实现多任务用法解析!(yield阻塞 greenlet)

前言:

本文实例讲述了Python 协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法。分享给大家供大家参考,具体如下:

提示:实现多任务:进程消耗的资源最大,线程消耗的资源次之,协程消耗的资源最少(单线程)。

gevent实现协程,gevent是通过阻塞代码(例如网络延迟等)来自动切换要执行的任务,所以在进行IO密集型程序时(例如爬虫),使用gevent可以提高效率(有效利用网络延迟的时间去执行其他任务)。

GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程的效率变低(哪个线程抢到锁,就执行哪个线程)。在IO密集型程序中,多线程依然比单线程效率高(GIL通过IO阻塞自动切换多线程)。

解决GIL(全局解释器锁)的问题的三种方法:

1、不要用C语言版本的Python解释器。

2、让子线程运行其他语言代码(例如:主线程运行Python代码,子线程运行C语言代码(C语言的动态库))。

3、多进程代替多线程(多进程可以利用多核CPU)。

demo.py(协程底层原理,yield):

demo.py(greenlet实现协程,封装了yield):

demo.py(gevent实现协程,封装了greenlet,遇到阻塞代码自动切换协程任务):

运行结果:

demo.py(gevent打补丁,monkey自动替换原生阻塞类代码。重要,常用):

运行结果:

demo.py(gevent底层原理):

 try:
recv_data = client_socket.recv(1024) # 用抛异常的方式代替阻塞。
except Exception as ret:
print("----这个客户端还没有发送过来数据----")
else:
if recv_data:
# 对方发送过来数据
print("----客户端发送过来了数据-----")
else:
# 对方调用close 导致了 recv返回
client_socket.close()
client_socket_list.remove(client_socket)
print("---客户端已经关闭----")

以上就是本文的全部内容啦!

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编后,且在后台私信小编:“07”即可领取。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/213054.html