python协程

Python学习笔记:协程初探

对着背影说爱祢 提交于 2020-01-26 03:43:57
(本文主要参照Python在线文档进行学习) 0.前言 进程有自己独立的堆和栈,由操作系统调度;线程有独立的栈,共享堆空间,标准的线程也是由操作系统调度;协程和线程一样共享堆不共享栈,但是是由程序员在协程的代码里显示调度。协程避免了无意义的调度,进而提升性能,但也增加了程序员的责任。 1.初探 asyncio是一个使用 async / await 语法编写并发代码的库,在Python 3.4 引入,直接内置了对异步IO的支持,并在后来的版本中不断完善。早期基于生成器来实现协程,但是在 Python 3.8 开始不推荐使用该方式,并将在 3.10 移除。目前标准的是使用 async / await 语法来实现协程。 要实际运行协程,asyncio 提供了三种主要机制: a.使用 asyncio.run() 函数来运行顶层入口点 (运行代码需要 Python3.7 ;要注意的是,直接调用 func() 并不能执行) import asyncio import time async def func(): print('func in'+time.strftime('%X')) await asyncio.sleep(3) print('func out'+time.strftime('%X')) print('begin'+time.strftime('%X')) asyncio

day35 python socket 单线程的并发 io多路复用 协程 greenlet模块 gevent模块

不想你离开。 提交于 2020-01-22 18:25:02
day35 python socket 单线程的并发 io多路复用 协程 greenlet模块 gevent模块 一.socket相关 1.socket: 所有的网络请求都是基于socket实现的,默认是阻塞的 2.requests是用的socket的客户端 3.socket到底哪端(谁)发生了变化 如果客户端向服务端发起连接时, 则服务端发生了变化 如果服务端向客户端发送数据时, 则客户端发生了变化 conn,addr = server.accept() conn.recv() 4.如果想要提高并发(目前有以下两种) 多进程: 计算密集型 多线程: io密集型,如socket请求 二.单线程的并发 需求: 模拟浏览器发送请求: 向百度发送请求搜索三个关键词 1.单线程(串行): 使用requests模块 import requests key_list = ['bajie','wukong','datang'] for item in key_list: ret = requests.get( url="https://www.baidu.com/s?wd=%s" % (item,), headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox

Python-协程

风格不统一 提交于 2020-01-20 04:14:24
一、引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质: 切换+保存状态 。 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 一种情况是该任务发生了阻塞; 另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它。 协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换。 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 需要 注意 的是: 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled 可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send 可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 通过yield实现

Python多线程和GIL锁

一曲冷凌霜 提交于 2020-01-20 03:10:07
Python 有GIL锁,所以它的多线程实际上是单线程 GIL 全称全局解释器锁(Global Interpreter Lock), 它锁的解释器,而不是Python代码,它防止多线程同时执行Python的字节码, 防止多线程同时访问Python的对象 Python的解释器通过切换线程的方式来模拟多线程并发的情况 那岂不是说Python多线程不会提高效率了??? 非也!!! 对于IO密集型工作,多线程可以大幅度提高效率,而对于CPU密集型工作,多线程是没用的. IO密集型 涉及到网络,磁盘IO,硬盘读写等都是IO密集型工作,这类任务对CPU的消耗较少,大部分时间不是花在代码上,而是其他操作上 CPU密集型 特点是进行大量的计算,消耗CPU资源, 比如我们常见的排序算法,对视频的解码之类的,大部分时间花在代码上 最后: CPU密集型程序适合用C等编译型语言开发的多线程, 而IO密集型程序适合Python等脚本语言开发的多线程 在使用多线程的时候,多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁,类似于协程. 在处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程 来源: CSDN 作者: print('hello world') 链接: https://blog.csdn.net

Python协程

妖精的绣舞 提交于 2020-01-19 16:48:53
协程是一种实现并行编程的方法。不同于多线程或者多进程编程,各个协程其实还是在一个线程里运行,只是我们可以控制每个协程什么时候运行,什么时候停止,当一个协程停止时让另外的协程运行,从而达到并行计算的效果。运用协程的优点在于,因为所有的协程其实都是运行在一个线程里,因此它减少了在一个个协程间切换的代价,也不必考虑锁的问题。所以协程实现起来还是比较方便和简单的。 下面展示一个最简单的Python协程: def coroutine(): print "coroutine" x = 1 n = yield x print n,x c = coroutine() x= c.next() c.send(5) 输出如下: coroutine 1 5 1 Traceback (most recent call last): File "C:\PythonScript\coroutine.py", line 11, in <module> c.send(5) StopIteration 上面的代码中,首先生成协程对象c。之后需要执行一下c.next,程序会跑到coroutine函数中第一个yield的地方,并将yeild右边的值传给x。之后不断调用send,并将send中传入的参数赋值给n。当函数调用完毕的时候,会触发StopIteration的异常。 Python可以通过inspect

Python函数进阶:闭包、装饰器、生成器、协程

南楼画角 提交于 2020-01-19 13:21:34
/*--> */ /*--> */ 返回目录 本篇索引 (1) 闭包 (2) 装饰器 (3) 生成器 (4) 协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++、Java、JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现。 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包。” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量。 闭包的优点是:实现起来比类稍微轻巧一点(意思就是可以少敲一些代码),并且运行速度比类要快得多(据说约快50%)。下面是一个定义闭包的简单例子: def foo(x, y): def hellofun(): print('hellofun x is %d, y is %d.' %(x,y)) return hellofun a = foo(1,2) b = foo(30,40) a() b() # 运行结果为: hellofun x is 1, y is 2. hellofun x is 30, y is 40. 上例中,foo就定义了一个闭包,它将内部定义的函数hellofun返回(但并不运行这个函数), 同时将入参x,y作为以后hellofun要运行时的环境

深入理解Python中的yield和send

烈酒焚心 提交于 2020-01-19 12:17:39
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互。 但是需要注意,在一个生成器对象没有执行next方法之前,由于没有yield语句被挂起,所以执行send方法会报错。 因为当send方法的参数为None时,它与next方法完全等价。但是注意,虽然这样的代码可以接受,但是不规范。所以,在调用send方法之前,还是先调用一次next方法为好。 python特性(八):生成器对象的send方法 - CSDN博客 彻底理解Python中的yield - 简书 Python学习-yield浅析和send()函数 - CSDN博客 Python yield与实现 - cococo点点 - 博客园 yield与send实现协程操作 - 看雪。 - 博客园 转自: https://www.cnblogs.com/wushuaishuai/p/9212812.html 来源: CSDN 作者: yi好快的刀 链接: https://blog.csdn.net/weixin_39461487/article/details/104038635

python 各种开源库

ぃ、小莉子 提交于 2020-01-17 00:06:05
测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链接 --推荐 mechanize- Python中有状态的程序化Web浏览。 链接 selene - 使用Python + Ajax支持+ PageObjects + Widgets进行简明UI测试 链接 hitch - 基于服务的应用程序的高级集成测试框架。 链接 Needle - Css 自动化测试框架。 链接 seleniumbase - 端到端自动化测试框架。 链接 pytest_splinter - pytest spinter和selenium集成。 链接 Browsermob Proxy - Browsermob Proxy的python包装器。 链接 Selenium-Requests - 扩展Selenium WebDriver类以包含请求库中的请求函数,同时完成所有需要的cookie和请求头处理。 链接 移动测试自动化 appium - 移动端UI自动化测试。 链接 --推荐 uiautomator- 安卓UI自动化测试。 链接 ATX - 智能手机自动化工具。支持iOS,Android,WebApp和游戏。 网易出品

【Python】调用lua

时光总嘲笑我的痴心妄想 提交于 2020-01-15 01:12:01
1,引言 lua本身又是嵌入语言。在语言本身上又一定的局限性。所以我打算把lua嵌入到python/java中。做调研的时候,java的嵌入较为麻烦,出现了各种问题。后来确定用python来作这个环境。这样能用上python 的协程、多线程。 2,环境搭建 pip install lupa 3,案例 3.1 test.lua function test1 ( params ) return 'test1:' .. params end function test2 ( params ) return 'test2:' .. params end -- 入口函数,实现反射函数调用 function functionCall ( func_name,params ) local is_true,result local sandBox = function ( func_name,params ) local result result = _G [ func_name ] ( params ) return result end is_true,result = pcall ( sandBox,func_name,params ) return result end 3.2 test.py import traceback from lupa import LuaRuntime

python目录之从入门到光头

≡放荡痞女 提交于 2020-01-13 18:59:24
后台管理 添加随笔 编写博客的基础 001 学到的markdown语法 python计算机基础 002 计算机的组成原理 003 编程语言分类 004 网络的瓶颈效应 005 计算机操作系统 006 python计算机基础之编程 python基础 python基础 007 python基础1 008 python基础2 009 Python 和Python解释器 010 python变量 011 Python变量内存管理 012 python解压缩 013 python注释 014 python格式化输出的三种方式 015 python基本算术运算符 016 python流程控制if判断与循环(for、while) 017 python深浅拷贝 018 python异常处理 019 接触python的一些小练习 python基础实战之猜年龄游戏 python支持的数据类型 020 python常量 021 python数字类型 022 python字符串类型 023 python列表类型 024 python字典类型 025 python布尔类型 026 python元组 027 python集合 028 python数据类型 029 一个列表如何根据另一个列表进行排序(数组的相对排序) 030 列表如何移除指定原属 031 列表内字典的排序 032 字典去重与排序 文件处理