greenlet

Python协程&asyncio&异步编程

喜夏-厌秋 提交于 2020-05-04 18:05:32
Python协程&asyncio&异步编程 1.协程 协程是微线程,是一种用户态上下文切换技术,通过一个线程实现代码块相互切换执行 实现协程有这么几种方法: greenlet,早期的模块 yield 关键字 asyncio python3.4引入的 async、await关键字 python3.5 主流[推荐] 1.1 greenlet实现协程 pip install greenlet # -*- coding: utf-8 -*- from greenlet import greenlet def func1(): print(1) # 第1步:输出1 gr2.switch() # 第2步:跳到func2函数 print(2) # 第5步:输出2 gr2.switch() # 第6步:跳到func2函数 def func2(): print(3) # 第3步:输出3 gr1.switch() # 第4步:跳到func1函数 print(4) # 第7步:输出4 gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch() # 第1步:去执行func1函数 1.2 yield关键字 # -*- coding: utf-8 -*- def func1(): yield 1 yield from func2() yield 2 def

Python爬虫【第3篇】【多线程】

陌路散爱 提交于 2020-05-04 08:00:20
一、多线程 Python标准库提供2个模块,thread是低级模块,threading是高级模块 1.threading模块创建多线程 方式1:把1个函数传入并创建Thread实例,然后调用start方法开始执行 import random import time,threading # 新线程执行的代码 def thread_run(urls): print ' Current %s is running... ' % threading.current_thread().name for url in urls: print ' %s ---->>> %s ' % (threading.current_thread().name,url) time.sleep(random.random()) print ' %s ended ' % threading.current_thread().name print ' %s is running... ' % threading.current_thread().name t1 = threading.Thread(target=thread_run,name= ' Thread_1 ' ,args=([ ' url_1 ' , ' url_2 ' , ' url_3 ' ],)) t2 = threading.Thread

Python并发编程二(多线程、协程、IO模型)

亡梦爱人 提交于 2020-05-04 07:02:50
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。 所以, 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。 多线程(即多个控制线程)的概念是, 在一个进程中存在多个线程,多个线程共享该进程的地址空间 ,相当于一个车间内有多条流水线,都共用一个车间的资源。例如,北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。 1.2线程与进程的区别 Threads share the address space of the process that created it; processes have their own address space. Threads have direct access to the data segment of its process; processes have their own copy of the data

用gunicorn+gevent启动Flask项目

我是研究僧i 提交于 2020-05-02 10:00:56
转自:https://blog.csdn.net/dutsoft/article/details/51452598 Flask,webpy,Django都带着 WSGI server,当然性能都不好,自带的web server 更多的是测试用途。线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。 greenlet是一个轻量级的协程库。gevent是基于greenlet的网络库。 guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。它的特点是与各个web框架结合紧密,部署特别方便。 gunicorn安装和使用 安装 pip install gunicorn 启动 gunicorn code:application 其中code就是指python程序代码code.py,application就是那个wsgi func的名字。这样运行的话, gunicorn 默认作为一个监听 127.0.0.1:8000 的web server,可以在本机通过: http://127.0.0.1:8000 访问。 设置监听端口 如果要通过网络访问,则需要绑定不同的地址(也可以同时设置监听端口)。 gunicorn -b 127.0.0

05: greenlet:轻量级的并发编程

烈酒焚心 提交于 2020-05-01 19:32:54
网络编程其他篇 1.1 greenlet简介   1、greenlet原理 & 使用     1. greenle间切换         1)一个 “greenlet” 是一个很小的独立微线程,可以把它想像成一个堆栈帧,栈底是初始调用,而栈顶是当前greenlet的暂停位置。         2)你使用greenlet创建一堆这样的堆栈,然后在他们之间跳转执行。         3)跳转不是绝对的:一个greenlet必须选择跳转到选择好的另一个greenlet,这会让前一个挂起,而后一个恢复,           两 个greenlet之间的跳转称为 切换(switch) 。     2. 每个greenlet生命周期         1)当你创建一个greenlet,它得到一个初始化过的空堆栈;         2)当你第一次切换到它,他会启动指定的函数,然后切换跳出greenlet。         3)当最终栈底 函数结束时,greenlet的堆栈又变成空的了,greenlet也会因为一个未捕捉的异常死掉。 # ! /usr/bin/env python # -*- coding: utf-8 -*- from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2():

gevent支持的协程

拟墨画扇 提交于 2020-05-01 14:24:00
Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是 Greenlet , 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。 1 import gevent 2 3 def foo(): 4 print ( ' Running in foo ' ) 5 gevent.sleep(1 ) 6 print ( ' Explicit context switch to foo again ' ) 7 8 def bar(): 9 print ( ' Explicit context to bar ' ) 10 gevent.sleep(2 ) 11 print ( ' Implicit context switch to bar again ' ) 12 gevent.joinall([ 13 gevent.spawn(foo), 14 gevent.spawn(bar), 15 ]) 1 from gevent import monkey; 2 3 monkey.patch_all() 4 from urllib.request import urlopen 5 import time 6 7 def f(url): 8 print ( ' GET:

Greenlet

丶灬走出姿态 提交于 2020-05-01 13:39:12
1 from greenlet import greenlet 2 def test1(): 3 print (12 ) 4 gr2.switch() 5 print (34 ) 6 gr2.switch() 7 def test2(): 8 print (56 ) 9 gr1.switch() 10 print (78 ) 11 gr1= greenlet(test1) 12 gr2= greenlet(test2) 13 gr1.switch() 感觉确实用着比generator还简单了呢,但好像还没有解决一个问题,就是遇到IO操作,自动切换,对不对? 来源: oschina 链接: https://my.oschina.net/u/4346652/blog/4260854

python并发编程之gevent协程(四)

我与影子孤独终老i 提交于 2020-04-27 19:03:27
协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块。由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成。 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asyncio协程(三) python并发编程之gevent协程(四) python并发编程之Queue线程、进程、协程通信(五) python并发编程之进程、线程、协程的调度原理(六) 基于生成器的简单协程 import time def A(): for i in range(100): print("----A---") yield i time.sleep(0.5) def B(c): while True: print("----B---") try: next(c) except StopIteration: break else: time.sleep(0.5) if __name__ == '__main__': a = A() B(a) 上面的例子并没有带来代码效率的提高,因为time.sleep()是同步阻塞操作;上例主要是为了说明协程的上下文切换原理。 greenlet的协程 greenlet模块也是程序显性主动控制协程切换

【整理】Python之JIT、Django、Greenlet和Stackless

China☆狼群 提交于 2019-12-07 04:16:31
【JIT】 即时编译(Just-in-time compilation),又称为动态编译,是一种提高程序运行效率的方法。 通常程序有两种编译方式:静态编译与动态编译(直译)。在静态编译中,程序在执行前全部被翻译为机器码,而动态直译则是边运行边翻译。 即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。 另外,一般来讲编译执行比解释执行要快,但是编译之后又不能跨平台,那我们就到目标平台上去,先编译再执行,这样就比纯解释要快了。这种编译是在“运行”的时候自动进行的,所以叫即时编译(JIT)。 【 Django 】 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC(Model View Controller)的设计模式,M是指数据模型,V是指用户界面,C则是控制器。 它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。 Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY(Don't

Ubuntu 安装gevent

狂风中的少年 提交于 2019-12-05 04:31:30
Gevent是一个基于greenlet的Python的并发框架,以赖于greenlet和libevent库,因此安装Gevent前,首先需要安装greenlet和libevent。 libevent的安装,这里就不介绍了,网上的安装教程一大箩,可以去google一下。这里主要介绍greelet和gevent的安装,其实非常简单,往下看吧。 1、安装greenlet 安装前当然要先下载greenlet(废话),可以到 http://pypi.python.org/pypi/greenlet 下载,下载的是zip文件,下载完成后, 解压:unzip greenlet-0.4.0.zip 进入目录:cd greenlet-0.4.0 安装:sudo python setup.py install 测试:进入python解析器i测试一下,如果import greenlet没的报错,安装成功。 2、gevent的安装 首先下载从 http://pypi.python.org/pypi/gevent#downloads 下载源包 解压:tar -zxvf gevent-0.13.7.tar 进入目录:cd gevent-0.13.7 安装:sudo python setup.py install 等待安装完成,进入python解释器输入import gevent,如果没有提示错误,则安装成功。