python协程

Python进程、线程、协程之间的关系

微笑、不失礼 提交于 2020-01-04 04:45:31
一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。 1.进程: 表示一个程序的执行活动 (打开程序、读写程序数据、关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 (执行功能1,执行功能2) 一个程序至少有一个进程 一个进程至少有一个线程 1.并行: 需要处理的任务数 == CPU核心数量 两个任务 两个核心 任务1:------------- 任务2:------------- 2.并发: 需要处理的任务数 > CPU核心数量 三个任务 一个核心 任务1: ----- ------ 任务2: ------ 任务3: ------ 二、从程序角度 多进程和多线程 表示:当前程序可以同时执行多个任务 进程和线程都是由 操作系统调度完成 1.进程:    每个进程都是有自己独立的内存空间,不同进程之间的内存空间是不能共享。 不同进程之间的通信是由操作系统来完成的。 不同进程之间的通信效率低切换开销也大。 2.线程:   一个进程下可以有多个线程,同一个进程内的线程可以共享内存空间. 不同线程之间的通信 有进程 管理。 不同线程之间的通信效率高,切换开销小。 3.互斥锁:   共享意味着多个线程的竞争 会导致不安全问题。 为了保护内存空间的数据不被多个线程同时读写, 导致数据隐患, 于是诞生了" 互斥锁 "。 "互斥锁":

Python多进程、多线程、协程

醉酒当歌 提交于 2020-01-04 04:45:04
转载:https://www.cnblogs.com/huangguifeng/p/7632799.html 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...) 一个程序至少有一个进程,一个进程至少有一个线程。 并行 和 并发: 并行:多个CPU核心,不同的程序就分配给不同的CPU来运行。可以让多个程序同时执行。 cpu1 ------------- cpu2 ------------- cpu3 ------------- cpu4 ------------- 并发:单个CPU核心,在一个时间切片里一次只能运行一个程序,如果需要运行多个程序,则串行执行。 cpu1  ----  ---- cpu1    ----  ---- 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 线程:一个进程可以有多个线程

python学习笔记 异步asyncio

放肆的年华 提交于 2020-01-02 05:04:47
asyncio 是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。 asyncio 的编程模型就是一个消息循环。我们从 asyncio 模块中直接获取一个 EventLoop 的引用,然后把需要执行的协程扔到 EventLoop 中执行,就实现了异步IO。 用 asyncio 实现 Hello world 代码如下: import asyncio @asyncio.coroutine def hello(): print("Hello world!") # 异步调用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("Hello again!") # 获取EventLoop: loop = asyncio.get_event_loop() # 执行coroutine loop.run_until_complete(hello()) loop.close() @asyncio.coroutine把一个generator标记为coroutine类型,然后,就把这个coroutine扔到eventloop中去执行 hello()会先打印出helloworld,然后yield from可以让我们方便的调用另一个generator,由于asyncio.sleep(1)也是一个coroutine

Python核心编程

瘦欲@ 提交于 2020-01-02 01:09:55
模块循环导入问题 深拷贝和浅拷贝 位运算 获取私有属性的值 property的使用 迭代器 闭包 装饰器 python动态添加属性以及方法 生成器 1.模块循环导入问题 #vi a.py from b import b def a(): print('-----a-----') b() a() #vi b.py from a import a def b(): print('-----b-----') def c(): print('------c-----') a() c() #python3 a.py的结果是:ImportError:cannot import name 'a' 解决办法:不要互相调用,另外写个 主模块 去调它们(子模块) 2.深拷贝与浅拷贝 #浅拷贝 a = [11,22,33] b = a id(a) == id(b) #True #深拷贝 a = [11,22,33] import copy c = copy.deepcopy(a) id(a) == id(b) #False #copy与deepcopy的区别 copy只拷贝第一层引用;deepcopy是递归拷贝所有引用 当copy遇到元组时,会进行浅拷贝(只指向) 3.位运算 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 按位左移 >> 按位右移 用途:直接操作二进制,省内存,效率高 按位移

python多任务、进程、线程、协程笔记

[亡魂溺海] 提交于 2019-12-29 19:29:42
多任务笔记: python中多任务、进程、线程、协程: 多任务 即操作系统可以同时运行多个任务。 进程: 是对各种资源管理的集合,qq 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等 线程: 是操作系统最小的调度单位, 是一串指令的集合。 进程要想操作CPU,就必须要创建一个线程(进程中至少包含一个线程) 具体详解见以下链接: 概念详解及代码: “”" 【多任务】 阅读下段文字,说明一下 (1)什么是任务,什么是多任务 (2)什么是进程(Process) (3)什么是线程(Thread) (4)什么是协程(Coroutine) 了解如何使用Python创建多线程应用 “”" import threading import time class MyThread ( threading . Thread ) : def __init__ ( self , name ) : threading . Thread . __init__ ( self ) self . is_run = True self . name = name def stop ( self ) : self . is_run = False def run ( self ) : for _i_ in range ( 10 ) : if not self . is_run

python面试题

喜夏-厌秋 提交于 2019-12-28 03:52:36
首页 代码 文档 问答 资讯 经验 GitHub日报 | 安卓开发专栏 | 开发者周刊 | Android Studio 使用推荐 | Android开发推荐 登录 注册 www.open-open.com/lib OPEN经验 投稿 全部经验分类 Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类 > 开发语言与工具 > Python开发 关于Python的面试题 Python 2016-01-25 11:02:47 发布 您的评价 : 5.0 收藏 3收藏 来自: https://github.com/taizilongxu/interview_python?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io Table of Contents Python语言特性 1 Python的函数参数传递 2 Python中的元类(metaclass) 3 @staticmethod和@classmethod 4 类变量和实例变量 5 Python自省 6 字典推导式 7

python基础6 迭代器 生成器

半城伤御伤魂 提交于 2019-12-28 01:13:15
迭代器 可迭代的或迭代对象 可迭代的: 内部含有__iter__方法的数据类型叫可迭代的,也叫 迭代对象 , range是一个迭代对象 ,内部含有iter()方法。为什么可迭代对象能被for 循环,因为可迭代对象含有iter方法,只要函数iter方法的对象就可以被for循环。这也是可迭代协议。 运用dir()方法来测试一个数据类型是不是可迭代的的。如果含有iter的,就是可迭代对象、 迭代器协议 迭代器协议 是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常, 以终止迭代 (只能往后走不能往前退)。 迭代器:可以被 next() 函数调用并不断返回下一个值的对象称为迭代器 ,迭代器是一个实现了迭代器协议的对象。也可以这样说包含next方法的可迭代对象叫迭代器 迭代器和列表的区别? 区别在于节省内存和惰性运算 如果我有一个列表中有500个数据,那么这个列表就非常占用内存,如果把列表变为迭代器,就占用很少的内存,为什么会占用内存少呢,因为迭代器只记录当前这元素和下一个元素,当你找我要的时候我才在内存中生成数据,不找我要,就不生成数据,也就不占用内存,这就是迭代器的惰性运算。 如何区分迭代器和可迭代对象?这个在我们时间长了后会混淆。 可迭代对象最简单的定义:可以使用for in 语句进行循环的对象。比如字符串、列表、元组

Python之迭代器和生成器

霸气de小男生 提交于 2019-12-28 01:12:45
迭代器 可迭代的数据类型: list dic str set tuple f=open()--文件句柄 range enumerate 不可迭代的数据类型: int bool 什么叫迭代? 结合我们使用for循环取值的现象,再从字面上理解一下,其实迭代就是,可以将某个数据集内的数据“一个挨着一个的取出来”,就 叫做迭代 。 什么是 可迭代协议 ? 可以被迭代要满足的要求就叫做可迭代协议。 可迭代协议 的定义非常简单,就是内部实现了__iter__方法, 只要含有__iter__方法的都是可迭代的。 可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。 在for循环中,就是在内部调用了__next__方法才能取到一个一个的值。 print(dir[ ]) #告诉我列表拥有的方法 总结:   迭代器遵循 迭代器协议:必须拥有__iter__方法和__next__方法。   可以被for循环的都是可迭代的   可迭代的内部都有__iter__方法   只要是迭代器 一定可迭代   可迭代的.__iter__()方法就可以得到一个迭代器   迭代器中的__next__()方法可以一个一个的获取值   for循环其实就是在使用迭代器   只有是可迭代对象的时候 才能用 for   当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代

python函数

こ雲淡風輕ζ 提交于 2019-12-27 09:52:38
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 def ChangeInt(a): a = 10 b = 2 ChangeInt(b) print(b) def changeme(mylist): "修改传入的列表" mylist.append([1, 2, 3, 4]) print("函数内取值: ", mylist) return # 调用changeme函数 mylist = [10, 20, 30] changeme(mylist) print("函数外取值: ", mylist) def printme(str): "打印任何传入的字符串" print(str) return #

Python:asyncio模块学习

匆匆过客 提交于 2019-12-27 08:32:48
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了协程的概念,可是这个还是以生成器对象为基础,3.5则确定了协程的语法。下面将简单介绍asyncio的使用。实现协程的不仅仅是asyncio,tornado和gevent都实现了类似的功能。 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。 future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别 async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。 上述的概念单独拎出来都不好懂,比较他们之间是相互联系,一起工作。下面看例子,再回溯上述概念,更利于理解。