Python并发编程理解yield from、协程

一、首页,认识一下可迭代,迭代器和生成器

可迭代,如:list,dict,tuple,deque等都是可迭代对象;

验证,需要借助collections.abc这个模块(python2中没有)使用isinstance()来类别一个对象是否是可迭代的(Iterable),是否是迭代器(Iterator),是否是生成器(Generator)

代码如下:import collections

      from collections.abc import Iterable.Iterator.Generator

#字符串

ast="xiaoming"

print("字符串:{}".format(ast))

print(isinstarnce(ast,Iterable))

print(isinstance(ast,Iterator))

print(isinstance(alist,Generator))

#列表

alist=[21,24,12,32,19]

print(isinstarnce(alist,Iterable))

print(isinstance(alist,Iterator))

print(isinstance(alist,Generator))

#字典

adict={"name":"王华","gender":"男","age":18}

print(isinstarnce(adict,Iterable))

print(isinstance(adict,Iterator))

print(isinstance(adict,Generator))

#deque

adeque=collections.deque("adbdef")

print("字符串:{}".format(adeque))

print(isinstarnce(adeque,Iterable))

print(isinstance(adeque,Iterator))

print(isinstance(adeque,Generator))

扩展知识:

可迭代对象,是其内部实现了,__iter__这个魔术方法。可以通过,dir()方法来查看是否有__iter__来判断一个变量是否是可迭代的;

迭代器:

对比可迭代对象,迭代器其实就是多了一个函数而已。就是__next__(),我们可以不再使用for循环来间断获取元素值。而是可以直接使用next()方法来实现。

迭代器是在可迭代的基础上实现的。要创建一个迭代器,我们首先得有一个可迭代对象。

**重点:生成器

生成器的概念是在python2.2中首次出现,之所以引入生成器的概念是为了实现一个在计算下一个值时不需要浪费空间的结构。生成器是在迭代器的基础上(可使用for循环可以使用next())再实现了yield。

yield是什么东西呢,它相当于我们函数里的return,在每次next()或者for遍历的时候都会yield这里将新的值返回回去,并在这里阻塞,等待下一次的调用。正是由于这样的机制,才使用生成器在python编程中大放异彩;

生成器的生命周期:

gen_creaated  #等待开始执行

gen_running #解释器正在执行(只有多线程应用中才能看到这个状态)

gen_suspended #在yield表达式处暂停

gen_closed #执行结束

**协程

协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或者开始执行程序。

协程通过使用yield暂停生成器,可以将程序的执行流程交给其他的子程序,从而实现不同子程序的之间的交替执行。

原文地址:https://www.cnblogs.com/wwwcf1982603555/p/9081537.html

时间: 2024-10-19 12:20:58

Python并发编程理解yield from、协程的相关文章

python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1', 8080)) while True: msg = input(">>>:").strip() if not msg:break client.send(msg.encode("utf-8")) data = client.recv(

11.python并发入门(part12 初识协程)

一.协程的简介. 协程,又被称为微线程,虽然是单进程,单线程,但是在某种情况下,在python中的协程执行效率会优于多线程. 这是因为协程之间的切换和线程的切换是完全不一样的!协程的切换是由程序自身控制的(程序的开发者使用yield去进行控制,协程和协程之间的切换是可控制的,想什么时候切换就什么时候切换). 当使用多线程时,开的线程越多,协程的优势就越明显. 协程的另一个优点,就是无需锁机制,因为协程只有一个进程,和线程,不存在多线程或者多进程之间访问公共资源的冲突,所以说,在协程中无需加锁,如

python 并发编程 协程 目录

python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 原文地址:https://www.cnblogs.com/mingerlcm/p/11148935.html

python-学习-python并发编程之多进程与多线程

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似.  multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,

Python:线程、进程与协程(4)——multiprocessing模块(1)

multiprocessing模块是Python提供的用于多进程开发的包,multiprocessing包提供本地和远程两种并发,通过使用子进程而非线程有效地回避了全局解释器锁. (一)创建进程Process 类 创建进程的类,其源码在multiprocessing包的process.py里,有兴趣的可以对照着源码边理解边学习.它的用法同threading.Thread差不多,从它的类定义上就可以看的出来,如下: class Process(object):     '''     Proces

Python:线程、进程与协程(3)——Queue模块及源码分析

Queue模块是提供队列操作的模块,队列是线程间最常用的交换数据的形式.该模块提供了三种队列: Queue.Queue(maxsize):先进先出,maxsize是队列的大小,其值为非正数时为无线循环队列 Queue.LifoQueue(maxsize):后进先出,相当于栈 Queue.PriorityQueue(maxsize):优先级队列. 其中LifoQueue,PriorityQueue是Queue的子类.三者拥有以下共同的方法: qsize():返回近似的队列大小.为什么要加"近似&q

用yield实现协程 和asyncio模块

用yield实现协程 #基于yield实现异步 import time def consumer(): '''任务1:接收数据,处理数据''' while True: x=yield def producer(): '''任务2:生产数据''' g=consumer() next(g) for i in range(10000000): g.send(i) producer() 使用yield from实现的协程 import datetime import heapq # 堆模块 import

Python并发编程实例教程

有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态.打开文件列表.追踪指令执行情况的程序指针以及一个保存局部变量的调用栈.通常情况下,一个进程依照一个单序列控制流顺序执行,这个控制流被称为该进程的主线程.在任何给定的时刻,一个程序只做一件事情. 一个程序可以通过Python库函数中的os或subprocess模块创建新进程(例如os.fork()或

Python:线程、进程与协程(2)——threading模块(1)

上一篇博文介绍了Python中线程.进程与协程的基本概念,通过这几天的学习总结,下面来讲讲Python的threading模块.首先来看看threading模块有哪些方法和类吧. 主要有: Thread :线程类,这是用的最多的一个类,可以指定线程函数执行或者继承自它都可以实现子线程功能. Timer:与Thread类似,但要等待一段时间后才开始运行,是Thread的子类. Lock :原锁,是一个同步原语,当它锁住时不归某个特定的线程所有,这个可以对全局变量互斥时使用. RLock :可重入锁