当前位置: 首页 > news >正文

协程(微线程)

协程:

 1. 协程:单线程下的开发,又称为微线程
# 注意:线程和进程的操作是由程序出发系统接口,最后的执行者是系统,协程的执行操作则由程序员决定
# 1.1 简单实现协程
# import time
# def task1():
#     while True:
#         yield 's'
#         time.sleep(1)
# def task2():
#     while True:
#         yield 'y'
#         time.sleep(1)
# if __name__ == '__main__':
#     t1 = task1()
#     print(t1)# t2 = task2()# while True:#     print(next(t2))#     print(next(t1))
# 1.2 应用场景
# 1.如果一个线程里面由IO操作比较多时,可以用协程
#               IO操作 import/output
#               常见的IO操作:文件操作、网络请求
# 2.适合高并发处理

greenlet:

# greenlet:由C语言编写的实现协程模块,通过设置switch()来实现任意函数之间的切换
# 注意:greenlet属于手动切换,当遇到IO操作,程序会阻塞,而不能进行自动切换
# 通过green实现任务的切换
# 导入greenlet模块
from greenlet import greenlet
def sing():print('sing..')t2.switch()     #切换到t2中运行print('sing finally')
def dance():print('dance')print('dance finally')t1.switch()
# sing()
# dance()
if __name__ == '__main__':# 创建写成对象 greenlet(任务名)t1 = greenlet(sing)t2 = greenlet(dance)# t1.switch()     #切换到t1中运行t2.switch()

gevent:

# gevent:遇到IO操作时,会进行自动切换,属于主动式切换
# 导入模块
import gevent
import time
# 使用:
# gevent.spawn(函数名):创建协程对象
# gevent.sleep():       耗时操作
# gevent.join():          阻塞,等待某个协程执行结束
# gevent.joinall():       等待所有写成对象都执行结束再退出,参数是一个协程对象列表
# def sing():
#     print('sing..')
#     gevent.sleep(2)
#     print('sing finally')
# def dance():
#     print('dance')
#     gevent.sleep(3)
#     print('dance finally')
# if __name__ == '__main__':
#     g1 = gevent.spawn(sing)
#     g2 = gevent.spawn(dance)
#     # 2.阻塞
#     g1.join()   #等待g1执行结束
#     g2.join()
# joinall
# def sing(name):
#     for i in range(3):
#         gevent.sleep(1)
#         print(f'{name} is singing,第{i}次')
# if __name__ == '__main__':
#     gevent.joinall([
#         gevent.spawn(sing,'suyikai'),
#         gevent.spawn(sing,'xuchongwen')
#     ])
# joinall():等待所有协程都执行结束在退出# monkey补丁:拥有在模块进行时替换的功能
# 导入模块
# from gevent import monkey
# monkey.patch_all()    #将用到的time.sleep()天换成gevent里面自己实现耗时操作的gevent.sleep()方法
# # 注意:要放在补丁代码前面
# def sing(name):
#     for i in range(3):
#         time.sleep(1)
#         print(f'{name} is singing,第{i}次')
# if __name__ == '__main__':
#     gevent.joinall([
#         gevent.spawn(sing,'suyikai'),
#         gevent.spawn(sing,'xuchongwen')
#     ])# 总结:
# 1.线程是CPU调度的基本单位,线程是资源分配的基本单位,协程是单线程下的开发
# 2.进程、线程、协程的对比
#     进程:切换需要的资源最大,效率最低
#     线程:切换需要的资源一般,效率一般
#     协程:切换需要的资源最小,效率高
# 3.多线程适合IO密集型操作(文件操作、爬虫),多进程适合CPU密集型操作(科学计算、视频解码)
# 4.进程、线程、协程都是可以完成多任务的,可以根据自己实际开发的需要选择使用。
http://www.xdnf.cn/news/161569.html

相关文章:

  • Kdenlive 中的变形、畸变、透视相关功能
  • Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
  • 架构整洁之道 心得
  • 【线段树】P11414 [EPXLQ2024 fall round] 神奇磁铁|普及+
  • 如何在 PowerShell 脚本中调用外部 Windows 命令
  • 精益数据分析(29/126):深入剖析电子商务商业模式
  • 021-C语言文件操作
  • Linux系统性能调优技巧分享
  • 如何创建一个C#项目(基于VS2022版)
  • 本地电脑安装DeepSeek
  • 【特殊场景应对9】视频简历的适用场景与风险分析
  • Python----深度学习(基于DNN的PM2.5预测)
  • 作为高速通道光纤传输模式怎么理解以及到底有哪些?
  • “CSDN还有皮肤?“-如何更换(全网最新)
  • 小白如何学会完整挪用Github项目?(以pix2pix为例)
  • 识破养生假象,拥抱科学健康
  • 【随笔】地理探测器原理与运用
  • Python并发编程全景解析:多线程、多进程与协程的深度对比
  • 【OSG学习笔记】Day 11: 文件格式与数据交换
  • 3.1/Q1,Charls最新文章解读
  • RNN——循环神经网络
  • Jmeter数据库url开关设置+常用Beanshell
  • NSIS打包
  • 补码底层逻辑探讨
  • Web渗透之系统入侵与提权维权
  • 100个节点的部署,整合Docker、Kubernetes和Jenkins的详细设计
  • setup语法糖
  • JVM知识点(一)---内存管理
  • EXPLAIN使用教程EXPLAIN命令分析MySQL查询性能
  • LIDC-IDRI数据集切割代码教程【pylidc库】