gevent

python-多任务之协程

痴心易碎 提交于 2020-02-03 00:51:00
迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 # 例如 for value in [ 2 , 3 , 4 ] : print ( value ) 可迭代对象 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串 如何判断是否为可迭代对象 # 元组,列表,字典,字符串,集合,range都是可迭代对象 from collections . abc import Iterable # 3.7以上版本为导入collections.abc # from collections import Iterable # 判断对象是否是指定类型 result = isinstance ( ( 3 , 5 ) , Iterable ) print ( "元组是否是可迭代对象:" , result ) result = isinstance ( [ 3 , 5 ] , Iterable ) print ( "列表是否是可迭代对象:" , result ) result = isinstance ( { "name" : "张三" } , Iterable ) print ( "字典是否是可迭代对象:" , result ) result = isinstance ( "hello" , Iterable ) print

Eventlet or gevent or Stackless + Twisted, Pylons, Django and SQL Alchemy

[亡魂溺海] 提交于 2020-01-28 13:16:53
问题 We're using Twisted extensively for apps requiring a great deal of asynchronous io. There are some cases where stuff is cpu bound instead and for that we spawn a pool of processes to do the work and have a system for managing these across multiple servers as well - all done in Twisted. Works great. The problem is that it's hard to bring new team members up to speed. Writing asynchronous code in Twisted requires a near vertical learning curve. It's as if humans just don't think that way

爬虫小案例:多协程工作

送分小仙女□ 提交于 2020-01-26 22:46:59
为提高工作效率,让多个爬虫一起工作 需要使用的库是:gevent 1.方式一:使用队列的形式: from gevent import monkey # 从gevent库里导入monkey模块。 monkey.patch_all() # monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。 import gevent,time,requests # 导入gevent、time、requests from gevent.queue import Queue # 从gevent库里导入queue模块 start = time.time() # 记录开始时间 url_list = [ 'https://www.baidu.com/', 'https://www.sina.com.cn/', 'http://www.sohu.com/', 'https://www.qq.com/', 'https://www.163.com/', 'http://www.iqiyi.com/', 'https://www.tmall.com/', 'http://www.ifeng.com/' ] # 要爬取的网站 work = Queue() # 创建队列对象,并赋值给work。 for url in url_list: work.put_nowait(url) #

python进阶之多线程(简单介绍协程)

﹥>﹥吖頭↗ 提交于 2020-01-26 19:22:06
多线程 线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务,就是线程 线程又被称为 轻量级进程 (lightweight process),是更小的执行单元 一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源 一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快 线程与进程的区别 一般来讲:我们把进程用来分配资源,线程用来具体执行(CPU调度) 多线程的创建(函数和类) 创建线程的两种方式: 第一:通过 threading.Thread 直接在线程中运行函数; import threading,time def saySorry(): print("子线程%s启动" %(threading.current_thread().name)) #当前线程的名字 time.sleep(1) print("我能吃饭了吗?") if __name__ == "__main__": print('主线程%s启动' %(threading.current_thread().name)) for i in range(5):

【多任务协程高级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

pip快速导入包

对着背影说爱祢 提交于 2020-01-24 02:52:48
推荐清华大学的 https://pypi.tuna.tsinghua.edu.cn/simple 临时使用 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple 例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,这样就会从清华这边的镜像去安装gevent库。 来源: CSDN 作者: 南浔OoO 链接: https://blog.csdn.net/qq_45538469/article/details/104003983

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等代码

windows安装greenlet和gevent,以及使用方法

守給你的承諾、 提交于 2020-01-23 03:51:55
摘自:https://blog.csdn.net/aineko520/article/details/89223047 今天继续进行日常python的练习。 greenlet、gevent两个安装了python之后是不自带的,需要自行下载安装,下面是WIN的安装方法。 1、首先下载greenlet、gevent安装包。 greenlet、gevent下载地址是: https://www.lfd.uci.edu/~gohlke/pythonlibs/#greenlet 找到相对应的版本,如我的是python3.6的,就选择如图的版本安装。 2、因为Win没有pip命令,所以需要安装get-pip.py。 下载地址是:https://bootstrap.pypa.io/get-pip.py 3、安装pip。 把下载好的get-pip.py 放在python根目录(如我的是:D:\Program Files\Python)。 打开CMD=》CD到D:\Program Files\Python目录=》执行命令:python get-pip.py=》完成。 4、安装greenlet和gevent. 下载好的文件分别是:greenlet-0.4.15-cp36-cp36m-win_amd64.whl和gevent-1.4.0-cp36-cp36m-win_amd64.whl 打开CMD=

Flask-SocketIO 简单使用指南

本小妞迷上赌 提交于 2020-01-22 00:16:50
技术博客: https://github.com/yongxinz/tech-blog 同时,也欢迎关注我的微信公众号 AlwaysBeta ,更多精彩内容等你来。 Flask-SocketIO 使 Flask 应用程序能够访问客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript,C ++,Java 和 Swift 中的任何 SocketIO 官方客户端库或任何兼容的客户端来建立与服务器的永久连接。 安装 直接使用 pip 来安装: pip install flask - socketio 要求 Flask-SocketIO 兼容 Python 2.7 和 Python 3.3+。可以从以下三个选项中选择此程序包所依赖的异步服务: eventlet 性能最佳,支持长轮询和 WebSocket 传输。 gevent 在许多不同的配置中得到支持。gevent 包完全支持长轮询传输,但与 eventlet 不同,gevent 没有本机 WebSocket 支持。要添加对 WebSocket 的支持,目前有两种选择:安装 gevent-websocket 包为 gevent 增加 WebSocket 支持,或者可以使用带有 WebSocket 功能的 uWSGI Web 服务器。gevent 的使用也是一种高性能选项,但略低于 eventlet。 也可以使用基于

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

我的未来我决定 提交于 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时证明其就是迭代器 上两行代码验证其是否是迭代器