前言:
本文介绍了协程操作()的例子,以及使用协程实现多任务(定时交替协同执行)。 分享给大家,供大家参考,具体如下:
提示:实现多任务:进程消耗资源最大,线程消耗第二大资源,协程消耗资源最少(单线程)。
协程是通过阻塞代码(如网络延迟等)来实现自动切换要执行的任务的。 因此,在执行IO密集型程序(例如爬虫)时,使用它们可以提高效率(有效利用网络延迟时间来执行其他任务)。
GIL(全局解释器锁)是C语言版本解释器独有的。 GIL的存在使得多线程效率降低(哪个线程抢到锁就执行)。 在IO密集型程序中,多线程仍然比单线程效率更高(GIL通过IO阻塞自动切换多线程)。
解决GIL(全局解释器锁)问题的三种方法:
1.不要使用C语言版本的解释器。
2、让子线程运行其他语言代码(例如:主线程运行代码,子线程运行C语言代码(C语言的动态库))。
3、多进程代替多线程(多进程可以利用多核CPU)。
demo.py(协程底层原理,yield):
demo.py(实现协程,封装yield):
demo.py(实现协程,对其进行封装,遇到阻塞代码时自动切换协程任务):
运行结果:
demo.py(补丁,自动替换原生阻塞代码。重要,常用):
运行结果:
demo.py(底层原理):
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("---客户端已经关闭----")
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。