协程

【多任务协程高级day05】gevent+安装+gevent的使用+gevent切换执行+给程序打补丁

时光总嘲笑我的痴心妄想 提交于 2020-01-25 05:15:33
文章目录 gevent 安装 1. gevent的使用 2. gevent切换执行 3. 给程序打补丁 gevent greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块 gevent 其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。 由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO 安装 pip3 install gevent 1. gevent的使用 import gevent def f ( n ) : for i in range ( n ) : print ( gevent . getcurrent ( ) , i ) g1 = gevent . spawn ( f , 5 ) g2 = gevent . spawn ( f , 5 ) g3 = gevent . spawn ( f , 5 ) g1 . join ( ) g2 . join ( ) g3 . join ( ) 运行结果 < Greenlet at

安卓协程异步任务实践

99封情书 提交于 2020-01-25 03:21:44
使用协程的过程中,最常遇到的就是处理异步任务,先来前期的一些动作。设置BaseActivity 这里为什么要用覆写上下文的方式,是因为这里可以加入统一的异常 handler处理,但请注意, 这里的handler 只适用于处理launch 的协程,async的协程异常处理参看最后 open class BaseCorountineActivty : AppCompatActivity ( ) , CoroutineScope { //统一处理协程中异常的报错 val handler = CoroutineExceptionHandler { _ , e -> println ( "协程任务 顶层异常处理" ) } override fun onDestroy ( ) { cancel ( ) super . onDestroy ( ) } override val coroutineContext : CoroutineContext get ( ) = SupervisorJob ( ) + Dispatchers . Main + handler } 然后是测试的Activity, compute挂起函数模拟异步耗时任务 class TestActivity : BaseCorountineActivty ( ) { override fun onCreate (

tcp_server_协程gevent版本

牧云@^-^@ 提交于 2020-01-23 05:37:39
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2020/1/23 1:50 # @Author : liuyan # @File : test5_tcp_server_5协程gevent版本.py # @Software: PyCharm import gevent from gevent import monkey; monkey.patch_all() #使用此方法,会将代码中检查一遍,如有time.sleep()等延时方法,会自动转换为gevent.sleep() #在执行时动态替换,通常是在startup的时候. #把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候能够跟寻常一样使用,无需改动 # 调用此函数就不需要将time.sleep()手动换为gevent.sleep(),socket也不需要手动替换 # gevent的优势不仅仅是在代码中调用方便,厉害的是它拥有的monkey机制。 # 假设你不愿意修改原来已经写好的python代码,但是又想充分利用gevent机制,那么你就可以用monkey来做到这一点。 # 你所要做的就是在文件开头打一个patch,那么它就会自动替换你原来的thread、socket、time、multiprocessing等代码

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

协程(迭代器,生成器等)

我的未来我决定 提交于 2020-01-21 17:30:52
一、 补充知识 isinstance(a,A) True 以上如果返回值为True则表示a是A的一个子类 Iterable是一个类,这个类的子类都是可迭代对象 由上图可以知 列表是可迭代对象 问题来了:是否可以通过自己创建的类产生的对象判断ta可以迭代呢? 发现不可以 如果想让类创建的实例对象用for的话,在类中额外添加方法__iter__ 可行但是依旧不可以拿for来循环‘ 因为 普通列表在for循环中取第一个完成后内部自动跳到第二个,但是自己定义的类没有这个光标 因此得在iter 返回一个对象的引用(这个引用必须包含iter和next方法)才可以进行for循环 for temp in classmate: pass 当for循坏是否判断可以运行的时候就是判断classmate是否是一个可迭代对象 如何判断其是否是一个可迭代对象呢?只要classmate中由iter的这个类就算可迭代对象 此时调用对象中iter函数来得到return的返回值,只要返回值中既包含iter和next俩方法,此值就算是迭代器 使用迭代器中的next来进行正常可迭代对象的光标下移 因此每调用一次for循环的temp的时候j就会调用next返回给temp 第一行代码iter(classmate)返回迭代器,将迭代器给一个变量 第二行代码将返回True时证明其就是迭代器 上两行代码验证其是否是迭代器

脚本 2 协程

旧时模样 提交于 2020-01-20 04:48:44
文章目录 目的 协程的启动与停止 启动接口 停止接口 例子 yield return 需要注意的 原理 协程下载例子 目的 MonoBehaviour 不支持多线程,即,所有 Unity 提供给 MonoBehvaiour 调用地接口,只能在主线程调用,当然,其它原生 C# ,以及我们写地代码,只要不调用 Unity,都是可以进行多线程调用的。 Unity 提供协程,主要是为了简化异步逻辑调用,让代码可读性更高。它并不能让我们提高效率。 协程的启动与停止 启动接口 StartCoroutine public Coroutine StartCoroutine (IEnumerator routine ); public Coroutine StartCoroutine (string methodName , object value = null); 停止接口 StopCoroutine public void StopCoroutine (string methodName ); public void StopCoroutine (IEnumerator routine ); public void StopCoroutine (Coroutine routine ); public void StopAllCoroutines(); // 停止所有协程 例子 using

Python-协程

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

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要运行时的环境

深入理解协程(四):async/await异步爬虫实战

邮差的信 提交于 2020-01-18 12:18:09
本文目录: 同步方式爬取博客标题 async/await异步爬取博客标题 本片为深入理解协程系列文章的 补充 。 你将会在从本文中了解到: async/await 如何运用的实际的爬虫中。 案例 从CSDN上批量爬取指定文章的标题。文章列表如下: urls = [ 'https://blog.csdn.net/Jmilk/article/details/103218919', 'https://blog.csdn.net/stven_king/article/details/103256724', 'https://blog.csdn.net/csdnnews/article/details/103154693', 'https://blog.csdn.net/dg_lee/article/details/103951021', 'https://blog.csdn.net/m0_37907797/article/details/103272967', 'https://blog.csdn.net/zzq900503/article/details/49618605', 'https://blog.csdn.net/weixin_44339238/article/details/103977138', 'https://blog.csdn.net