python学习笔记(二十八)协程

本文深入探讨了协程的基本概念,对比线程说明其高效执行原理,并通过Python代码实例展示了如何使用协程进行数据传输及实现生产者与消费者模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、协程

子程序/函数:在所有语言中都是层级调用,比如A调用B,在B执行的过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后是A执行完毕一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用的顺序是明确的

协程概述:看上去也是子程序,但是在执行过程中,在子程序的内部可以中断,然后转而去执行别的子程序。那么不是函数调用,有点类似与CPU中断

与线程相比,协程的执行效率极高。因为只有一个线程,不存在多个变量同时写,不存在变量冲突,在协程中资源共享不加锁,只需要判断状态

 1、子程序调用

#子程序调用
def C():
	print('C---START')
	print('C---END')


def B():
	print('B---START')
	C()
	print('B---END')


def A():
	print('A---START')
	B()
	print('A---END')


A()

2、数据传输

#数据传输

def A():
    #空变量,存储的作用data始终为空
    data = ''
    r = yield data
    print(1,r,data)
    r = yield data
    print(2,r,data)
    r = yield data
    print(3,r,data)
    r = yield data
 
a = A()
#启动a
print(a.send(None))
print(a.send('a'))

二、协程原理

'''
python对协程的支持是通过generator实现的

'''

def A():
    print(1)
    yield 10
    print(2)
    yield 20
    print(3)
    yield 30
#协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
#返回值是一个生成器
a = A()
print(type(a))
print(next(a))
print(next(a))
print(next(a))



三、协程写生产者与消费者

#4个生产者在生产数据   3个消费者将生产的数据从队列中取出
import threading, time, queue, random


# 生产者
def product(c):
	c.send(None)
	for i in range(5):
		print("生产者生产了数据%d"%i)
		r = c.send(str(i))
		print("消费者消费了数据%s"%r)
	c.close()

# 消费者
def customer():
	data = ""
	while True:
		n = yield data
		if not n:
			return
		print("消费者消费了%d"%n)
		data ="200"


c = customer()
product(c)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值