协程

队列 事件 协程

橙三吉。 提交于 2019-11-28 16:25:36
线程队列 FIFO队列 # 1 FIFO队列 queue 先进先出 特殊参数 block=True, timeout=None import queue # q=queue.Queue(3) # q.put(666) # q.put(777) # q.put(888) # print(q.get()) # print(q.get()) # print(q.get()) LIFO 栈 # LIFO 栈. 先进后出 特殊参数 block=True, timeout=None import queue # q=queue.LifoQueue(3) # q.put(666) # q.put(777) # q.put(888) # print(q.get()) # print(q.get()) # print(q.get()) 优先级队列 # 优先级对列 需要元组的形式,(int,数据) int 代表优先级,数字越低,优先级越高. get先去重要的 import queue q=queue.PriorityQueue(3) q.put((10,'拉级消息')) q.put((-10,'重要消息')) q.put((5,'一般消息')) print(q.get()) print(q.get()) print(q.get()) 事件Event 并发的执行某个任务 .多线程多进程,几乎同时执行.

Python网络编程——协程

你离开我真会死。 提交于 2019-11-28 16:19:45
协程的概念 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程 协程也是实现多任务的一种方式 协程yield的代码实现 简单实现协程 import time# 定义协程def work1(): while True: print("work1...") time.sleep(1) yielddef work2(): while True: print("work2...") time.sleep(1) yieldif __name__ == '__main__': g1 = work1() g2 = work2() while True: next(g1) next(g2) 实现协程的第二种方式:greenlet greenlet介绍:为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单 首先使用pip安装greenlet模块: pip3 install greenlet greenlet的使用: # greentlet的使用import greenletimport timedef work1(): for i in range(10): print("work1") time

协程

こ雲淡風輕ζ 提交于 2019-11-28 16:17:47
---恢复内容开始--- 线程的其他方法   获取线程名 current_thread().getname()   获取线程id current_thread().ident() 线程队列(重点)   队列中的数据被多个线程同时取也是只有一个可以拿到     先进先出队列,与进程中队列相同   先进后出队列,q = queue,LifoQueue(3),类似于栈   优先级队列,q = PriorityQueue(3),放入的时候写入元组(5,'aaa') 5为序号,越小的越先取,取的时候显示元组。         如果元组第0项的优先级序号相同,类型不同会报错,相同则比较第二个元素在ascii表中的位置         序号可以为负数,纯数学方法比较大小 线程池(重点)    为了减少创建销毁线程的时间开销    列表的方式提交任务和读取结果可以避免程序执行时的阻塞 1 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 2 import time 3 from threading import current_thread 4 5 def f1(n): 6 #print('%s号线程'%current_thread().ident) 7 time.sleep(1) 8 #print(n) 9

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的再次封装

生成器

只愿长相守 提交于 2019-11-28 15:31:26
一、yield关键字 yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) <generator object func at 0x10ddb6b48> 生成器的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(F"g.__iter__ == g: {g.__iter__() == g}") res1 = g.__next__() print(f"res1: {res1}") res2 = next(g) print(f"res2: {res2}") # next(g) # StopIteration g.__iter__ == g: True

进程、线程与协程

蹲街弑〆低调 提交于 2019-11-28 13:47:11
进程:一个运行的程序就是一个进程。是系统资源分配的最小单位,拥有自己独立的内存空间。既不共享堆也不共享栈;由操作系统调度 线程:调度执行的最小单位,不能独立存在,共享内存。共享堆不共享栈;由操作系统调度 协程:是一种用户态的轻量级线程,调度完全由用户控制。和线程一样,共享堆不共享栈;由程序员调度 多进程适合在CPU密集型操作,如位数多的浮点运算 多线程适合在IO密集型操作,如爬虫 来源: https://www.cnblogs.com/kingshine007/p/11409518.html

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() 的时候执行,遇到

协程

丶灬走出姿态 提交于 2019-11-28 11:17:41
一.协程认识 协程: 单线程下的并发,又称为微线程,纤程。一句话说明什么是协程: 协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。   协程是基于单线程实现并发,即只用一个主线程(cpu只用一个),为实现并发,先认识并发本质(切换+保存状态)   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销 知识点: 1.协程是基于单线程来实现并发 2.协程的三种状态(和进程相同): 运行、阻塞、就绪3.python的线程属于内核级别,即由操作系统控制调度(如单线程遇到IO或执行时间过长就会交出cpu执行权限,切换其他线程运行) yield 本身就是一种在单线程下可以保存任务运行状态的方法: import time def fun1(): for i in range(10): print(f"第{i}次") time.sleep(1) yield def fun2(): g = fun1() for k in range(10): next(g) #第一次next,执行到yield结束,再次yield

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 ""