【Python】Python学习笔记18

代码笔记:

'''
协程是Python中用于处理程序并发执行的程序设计方式,它允许在程序执行的过程中暂停或恢复,适合I/O密集型任务。
    协程:协程是一种特殊的生成器函数,可以在执行过程中被挂起(yield),并在之后恢复。它们使得编写异步代码变得更加简单和清晰。
    事件循环:事件循环是运行协程的核心机制,负责调度和管理多个协程的执行。
'''
import time


def task1():
    while True:
        yield '好好学习'
def task2():
    while True:
        yield '天天向上'
if __name__ == '__main__':
    t1 = task1()
    t2 = task2()
    while True:
        print(next(t1))
        time.sleep(2)
        print(next(t2))
        break
'''
greenlet是Python中一个用于实现协作式多任务处理的库。
它提供了轻量级的线程(称为“绿色线程”),允许你在多个执行上下文之间进行切换,而无需操作系统的线程调度开销。
安装命令:pip install greenlet
基本概念:
    绿色线程:这些线程由应用程序自己管理,而不是依赖操作系统。这使得上下文切换非常快速和高效。
    协作式调度:绿色线程通过显式地让出控制权来实现切换。开发者可以决定何时切换到其他的绿色线程。
    轻量级:绿色线程的创建和管理成本较低,适合处理大量并发任务。
通过switch进行手动切换
'''
from greenlet import greenlet
def listening():
    print('听材料')
    g2.switch()     # 切换执行线程2
    print('听完了')
    g2.switch()
def choose():
    print('选择答案')
    g1.switch()
    print('全部选择完毕')

if __name__ == "__main__":
    g1 = greenlet(listening)    # 创建绿色线程:greenlet(函数名)
    g2 = greenlet(choose)
    g1.switch()     # 切换执行线程1
    print('听力考试结束')
'''
gevent是一个基于协程的Python网络库,用于实现高性能的并发网络应用。
它通过使用轻量级的“绿色线程”来处理大量的I/O操作,避免了传统线程和进程的开销,从而提高了效率。
主要特性:
    绿色线程:gevent 使用绿色线程(或称为协程)来管理并发任务,这些线程由 gevent 自己调度,轻量且高效。
    异步 I/O:通过事件循环和非阻塞 I/O,gevent 能够在等待 I/O 操作完成时切换到其他任务,从而提高程序的响应性。
    简单易用:gevent 的 API 设计类似于标准的 Python threading 或 asyncio,使得开发者可以轻松上手。
    集成支持:gevent 可以与其他常见的 Python 库(如 Flask、Django)集成,支持协程的异步操作。
gevent使线程遇到I/O操作时,能够自动切换,属于主动式切换。
'''
import gevent
def reading():
    print('阅读翻译材料')
    gevent.sleep(2)     # 模拟gevent识别的I/O阻塞
    print('阅读完毕')
def translation():
    print('写出译文')
    gevent.sleep(3)
    print('翻译完毕')
if __name__ == '__main__':
    g1 = gevent.spawn(reading)   # 1.创建协程对象:gevent.spawn(函数名)
    g2 = gevent.spawn(translation)
    g1.join()   # 2.阻塞:等待线程g1执行完毕,再执行后续线程
    g2.join()
def task_1(name):
    for i in range(4):
        print(f'{name}第{i+1}次学习Python')
        gevent.sleep(1)     # 模拟gevent识别的I/O阻塞
if __name__ == '__main__':
    gevent.joinall({        # gevent.joinall():等待所有线程执行完毕再结束并退出运行
        gevent.spawn(task_1, '张三'),
        gevent.spawn(task_1, '李四'),
        gevent.spawn(task_1, '王五')
    })
'''
monkey:打补丁,拥有在程序运行时替换的功能。
    monkey.patch_all():会将标准库中的阻塞调用(time.sleep)替换为非阻塞版本(gevent.sleep)。
    使得整个程序都可以使用 gevent 的协作式多任务特性。
注意:monkey.patch_all()需要放在被打补丁的调用之前。
'''
from gevent import monkey
monkey.patch_all()
def task_1(name):
    for i in range(2):
        print(f'{name}第{i+1}次学习Java')
        time.sleep(1)
if __name__ == '__main__':
    gevent.joinall({        # gevent.joinall():等待所有线程执行完毕再结束并退出运行
        gevent.spawn(task_1, '张三'),
        gevent.spawn(task_1, '李四'),
        gevent.spawn(task_1, '王五')
    })
'''
定义总结:
    进程:
        进程是操作系统分配资源的基本单位,它包含了程序的代码、数据,以及执行上下文(如堆栈和寄存器)。
        每个进程拥有独立的地址空间,相互之间的内存是隔离的。
    线程:
        线程是进程中的一个执行单元,同一进程内的多个线程共享进程的资源(如内存和打开的文件)。
        线程更轻量,创建和切换的开销比进程小。
    协程(Python特有):
        协程是一种用户级别的轻量级线程,通常在单个线程内实现。
        它们通过手动控制执行顺序,挂起和恢复执行,以实现并发。
关系:
    进程与线程:
        线程是构成进程的基本单位。一个进程可以包含多个线程,它们共享进程的资源。
    线程与协程:
        协程是线程的一种更轻量级的实现方式。
        多个协程可以在同一线程中并发运行,相比于线程,它们的切换开销更小,因为不涉及操作系统的调度。
进程、线程以及协程的异同点:
    ------------------------------------------------------------------------
            特性	        进程	            线程	            协程
        存储空间	    独立的地址空间     共享进程的地址空间	在同一线程中共享栈空间
        创建/销毁开销	    较大	            较小	            极小
        切换开销	        大	            较小	            很小
        调度	        由操作系统管理	由操作系统管理	    用户自定义调度
        并发模型	    通过多进程	    通过多线程	        通过协作式多任务
        通信方式	    IPC(进程间通信)	共享内存、锁等	    函数调用和共享数据
    ------------------------------------------------------------------------
使用场景:
    进程: 适用于需要高度隔离和安全性要求的任务,如服务器、后台服务等。
    线程: 适合需要共享大量数据或资源的应用,如 GUI 应用和高性能计算。
    协程: 适用于 I/O 密集型的应用,如网络爬虫、异步 Web 服务器等。
'''

运行结果:

好好学习
天天向上
听材料
选择答案
听完了
全部选择完毕
听力考试结束
阅读翻译材料
写出译文
阅读完毕
翻译完毕
张三第1次学习Python
李四第1次学习Python
王五第1次学习Python
张三第2次学习Python
李四第2次学习Python
王五第2次学习Python
张三第3次学习Python
李四第3次学习Python
王五第3次学习Python
张三第4次学习Python
李四第4次学习Python
王五第4次学习Python
张三第1次学习Java
李四第1次学习Java
王五第1次学习Java
张三第2次学习Java
李四第2次学习Java
王五第2次学习Java

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值