python协程

python协程gevent案例:爬取斗鱼美女图片

不打扰是莪最后的温柔 提交于 2019-11-28 15:48:56
分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图: 圈住的部分是我们需要的数据,然后复制它的网址为https://www.douyu.com/gapi/rknc/directory/yzRec/1,出于学习目的只爬取第一页(减少服务器压力)。然后把网址放到浏览器中测试是否可以访问。如图: 结果正常。 分析json数据,提取图片链接 最后分析发现json中的data里面的rl是每个房间的信息,大概有200条左右,拿出其中的一条查询里面的图片链接。 { "rid": 1282190, "rn": "大家要开心啊~", "uid": 77538371, "nn": "鲸鱼欧尼", "cid1": 8, "cid2": 201, "cid3": 581, "iv": 1, "av": "avatar_v3/201908/d62c503c603945098f2c22d0d95c3b2e", "ol": 610574, "url": "/1282190", "c2url": "/directory/game/yz", "c2name": "颜值", "icdata": { "217": { "url": "https://sta-op.douyucdn.cn/dy

python多任务——协程的使用

假装没事ソ 提交于 2019-11-28 15:38:36
使用yield完成多任务 import time def test1(): while True: print("--1--") time.sleep(0.5) yield None def test2(): while True: print("--2--") time.sleep(0.5) yield None if __name__ == "__main__": t1 = test1() t2 = test2() while True: next(t1) next(t2) 使用greenlet完成多任务 如果没有安装,则 pip install greenlet from greenlet import greenlet import time def test1(): while True: print("---A---") gr2.switch() time.sleep(0.5) def test2(): while True: print("---b---") gr1.switch() time.sleep(0.5) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch() 使用gevent完成多任务 首先使用 pip install gevent 进行安装 gevent是对greenlet的再次封装

python之 yield --- “协程”

烂漫一生 提交于 2019-11-28 13:17:38
在编程中我们经常会用到列表,以前使用列表时需要声明和初始化,在数据量比较大的时候也需要把列表完整生产出来,例如要存放1000给数据,需要准备长度1000的列表,这样计算机就需要准备内存放置这个列表,在Python中,这种一边循环一边计算的机制,称为生成器:generator,这个功能在列表使用时比较节省空间,使用方法: g=(i*2 for i in range(10)) data=g.__next__() print(d) 取列表时data=g.__next__(),此时才去生成。 应用:生成斐波拉契数列 def fig(num): n,a,b=0,0,1 while n<num: yield b a,b=b,a+b n+=1 return 'done' fig(10) 定义长度为10的数列 fig(10) for i in range(10): try: x=next(g) print(x) except StopIteration as e: print('error %s' % e.value) break 运行结果: 1 1 2 3 5 8 13 21 34 55 这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用 next() 的时候执行,遇到

Python库大全,建议收藏留用!

社会主义新天地 提交于 2019-11-28 11:11:24
学Python,想必大家都是从爬虫开始的吧。毕竟网上类似的资源很丰富,开源项目也非常多。 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 当我们在浏览器中输入一个url后回车,后台会发生什么? 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址。 向IP对应的服务器发送请求。 服务器响应请求,发回网页内容。 浏览器解析网页内容。 那么学习爬虫需要掌握哪些库呢? 通用: urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库(基于pycurl)。 pycurl – 网络库(绑定libcurl)。 urllib3 – Python HTTP库,安全连接池、支持文件post、可用性高。 httplib2 – 网络库。 RoboBrowser – 一个简单的、极具Python风格的Python库,无需独立的浏览器即可浏览网页。 MechanicalSoup -一个与网站自动交互Python库。 mechanize -有状态、可编程的Web浏览库。 socket – 底层网络接口(stdlib)。 Unirest for Python – Unirest是一套可用于多种语言的轻量级的HTTP库。 hyper – Python的HTTP/2客户端。 PySocks – SocksiPy更新并积极维护的版本

python进程|线程|协程

无人久伴 提交于 2019-11-28 10:33:28
进程(Process)   1)进程就是正在运行的程序,它是操作系统中,资源分配的最小单位   (1)资源分配:分配的是cpu和内存等物理资源   (2)进程号是进程的唯一标识   2)同一个程序执行两次之后是两个进程   3)进程和进程之间的关系: 数据彼此隔离,通过socket通信 获取进程id import os res = os.getpid() # 获取当前进行id (当前子进程) print(res) res = os.getppid() # 获取父进程id print(res) # result """ 13724 13800 """ 进程的基本用法 from multiprocessing import Process import time import os def func(): print("S2>>>当前子进程id:%s,它的父进程id:%s" %(os.getpid(),os.getppid())) if __name__ == "__main__": print("S1>>>子进程id:%s,父进程id:%s"%(os.getpid(),os.getppid())) p = Process(target=func) # 创建子进程 target = 函数 单独用一个进程去执行谁,去完成哪个任务 p.start() # 调用子进程 # result ""

python术语对照表

Deadly 提交于 2019-11-28 07:42:32
术语对照表 >>> 交互式终端中默认的 Python 提示符。往往会显示于能以交互方式在解释器里执行的样例代码之前。 ... 交互式终端中输入特殊代码行时默认的 Python 提示符,包括:缩进的代码块,成对的分隔符之内(圆括号、方括号、花括号或三重引号),或是指定一个装饰器之后。 2to3 一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题。 2to3 包含在标准库中,模块名为 lib2to3 ;并提供一个独立入口点 Tools/scripts/2to3 。参见 2to3 - 自动将 Python 2 代码转为 Python 3 代码 。 abstract base class -- 抽象基类 抽象基类简称 ABC,是对 duck-typing 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 hasattr() 显得过于笨拙或有微妙错误(例如使用 魔术方法 )。ABC 引入了虚拟子类,这种类并非继承自其他类,但却仍能被 isinstance() 和 issubclass() 所认可;详见 abc 模块文档。Python 自带许多内置的 ABC 用于实现数据结构(在 collections.abc 模块中)、数字(在 numbers 模块中)、流(在 io 模块中)、导入查找器和加载器

【Python协程的实现】

二次信任 提交于 2019-11-28 07:41:31
原文: http://blog.gqylpy.com/gqy/233 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换

python中重要的模块--asyncio

本小妞迷上赌 提交于 2019-11-28 06:24:32
asyncio 是python3增加的特性。不过backport到了2.7了。 python 2.7 Develop with asyncio Tasks and coroutines python 3.7 asyncio (org CN ) REF: 一份详细的asyncio入门教程 有大量的例子 python中重要的模块--asyncio 不同线程的事件循环 很多时候,我们的事件循环用于注册协程,而有的协程需要动态的添加到事件循环中。一个简单的方式就是使用多线程。 当前线程创建一个事件循环 ,然后在新建一个线程,在新线程中启动事件循环。 当前线程不会被block 。 详解python异步编程之asyncio(百万并发) 介绍 aiohttp Python异步IO编程之-asyncio协程应用例子 如何真正运行一个协程呢?asyncio 提供了三种机制: (1)asyncio.run() 函数,这是异步程序的主入口,相当于C语言中的main函数。 (2)用await等待协程,比如上例中的 await asyncio.sleep(1) 。再看下面的例子,我们定义了协程 say_delay() ,在main()协程中调用两次,第一次延迟1秒后打印“你好”,第二次延迟2秒后打印“猿人学”。这样我们通过 await 运行了两个协程。 从起止时间,多个协程是 顺序执行 的 (3)通过

python常见问题

混江龙づ霸主 提交于 2019-11-28 00:20:47
1、 __new__.__init__区别,如何实现单例模式,有什么优点 __new__是一个静态方法,__init__是一个实例方法 __new__返回一个创建的实例,__init__什么都不返回 __new__返回一个cls的实例时后面的__init__才能被调用 当创建一个新实例时调用__new__,初始化一个实例时调用__init__ 2、深浅拷贝 浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 3、HTTP/IP相关协议,分别位于哪层 http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据 http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用请求。web服务器收到所有请求后,向客户端发送响应信息, http特点是短连接,无状态 地址栏键输入URL,按下回车之后经历了什么? 1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址 2.解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接 3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器 4.服务器对浏览器请求做出响应

【Python协程的实现】

断了今生、忘了曾经 提交于 2019-11-27 21:09:56
原文: http://blog.gqylpy.com/gqy/233 " 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统