gevent

Python并发编程之进程池与线程池

心已入冬 提交于 2020-05-02 18:34:05
一.进程池与线程池 python标准模块concurrent.futures(并发未来)   1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用   2.concurrent.futures这个模块使用方便,接口都已封装完整   3.concurrent.futures模块即可以实现进程池也可以实现线程池   4.使用concurrent.futures模块导入进程池和线程池,如下:      from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor   5. p = ProcessPoolExecutor(max_works)对于进程池如果不写max_works:默认的是cpu的数目,默认是4个    p = ThreadPoolExecutor(max_works)对于线程池如果不写max_works:默认的是cpu的数目*5   6.如果是进程池,得到的结果如果是一个对象。我们得用一个.get()方法得到结果,但是现在用了concurent.future模块,我们可以用obj.result方法     p.submit(task,i) #相当于apply_async异步方法     p.shutdown() #默认有个参数wite=True

用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

通过优化Gunicorn配置获得更好的性能

故事扮演 提交于 2020-05-02 09:27:22
对于受CPU限制的应用程序,增加了工作程序和/或内核。对于受I / O限制的应用程序,请使用“伪线程”。 Gunicorn是Python WSGI HTTP Server,通常驻留在反向代理(例如Nginx)或负载平衡器(例如AWS ELB)和Web应用程序(例如Django或Flask)之间。 1 第一种并发方式(工作者,又名UNIX进程) 每个工作程序都是一个加载Python应用程序的UNIX进程。工作人员之间没有共享内存。 建议的数量workers是(2*CPU)+1。 对于双核(2 CPU)计算机,建议workers值为5 。 gunicorn --workers = 5 main:app 2 第二种并发方式(线程) Gunicorn还允许每个工人都有多个线程。在这种情况下,每个工作程序会加载一次Python应用程序,并且同一工作程序产生的每个线程都共享相同的内存空间。 要将线程用于Gunicorn,请使用threads设置。每次使用时threads,worker类都设置为gthread: gunicorn --workers = 5 --threads = 2 main:app workers * threads在我们的情况下,最大并发请求数为10。 使用辅助线程和线程时,建议的最大并发请求数仍为(2*CPU)+1。 因此,如果我们使用的是四核(4 CPU)计算机

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:

Python协程(真才实学,想学的进来)

坚强是说给别人听的谎言 提交于 2020-05-01 03:34:55
真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒。 ——蒙田《蒙田随笔全集》 上篇论述了关于python多线程是否是鸡肋的问题,得到了一些网友的认可,当然也有一些不同意见,表示协程比多线程不知强多少,在协程面前多线程算是鸡肋。好吧,对此我也表示赞同,然而上篇我论述的观点不在于多线程与协程的比较,而是在于IO密集型程序中,多线程尚有用武之地。   对于协程,我表示其效率确非多线程能比,但本人对此了解并不深入,因此最近几日参考了一些资料,学习整理了一番,在此分享出来仅供大家参考,如有谬误请指正,多谢。 申明: 本文介绍的协程是入门级别,大神请绕道而行,谨防入坑。 文章思路:本文将先介绍协程的概念,然后分别介绍Python2.x与3.x下协程的用法,最终将协程与多线程做比较并介绍异步爬虫模块。 协程 概念   协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。 优势 执行效率极高,因为子程序切换(函数)不是线程切换,由程序自身控制,没有切换线程的开销。所以与多线程相比,线程的数量越多,协程性能的优势越明显。

Socket threads hang in timeout block

馋奶兔 提交于 2020-04-30 07:44:56
问题 I'm trying to calculate the time it takes to receive all data from a given socket, so I'm using 'with Timeout(5, False)' to wait 5 seconds for data and then save the time of last recv. However, the current code just sits and hangs when I supply more than one thread. I'd like help figuring out why it just hangs when it should timeout. #!/usr/bin/env python import sys import time from gevent import socket, Timeout from gevent.pool import Pool def calc_wait(website): data = '' start = stop =

Socket threads hang in timeout block

拜拜、爱过 提交于 2020-04-30 07:43:05
问题 I'm trying to calculate the time it takes to receive all data from a given socket, so I'm using 'with Timeout(5, False)' to wait 5 seconds for data and then save the time of last recv. However, the current code just sits and hangs when I supply more than one thread. I'd like help figuring out why it just hangs when it should timeout. #!/usr/bin/env python import sys import time from gevent import socket, Timeout from gevent.pool import Pool def calc_wait(website): data = '' start = stop =

Socket threads hang in timeout block

℡╲_俬逩灬. 提交于 2020-04-30 07:41:25
问题 I'm trying to calculate the time it takes to receive all data from a given socket, so I'm using 'with Timeout(5, False)' to wait 5 seconds for data and then save the time of last recv. However, the current code just sits and hangs when I supply more than one thread. I'd like help figuring out why it just hangs when it should timeout. #!/usr/bin/env python import sys import time from gevent import socket, Timeout from gevent.pool import Pool def calc_wait(website): data = '' start = stop =

并发编程---进程、线程、协程

帅比萌擦擦* 提交于 2020-04-30 03:59:21
在python程序中的进程操作   之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快。以我们之前所学的知识,并不能实现创建进程这个功能,所以我们就需要借助python中强大的模块。 Python多线程情况下: - 计算密集型操作:效率低。(GIL锁) - IO操作: 效率高 Python多进程的情况下: - 计算密集型操作:效率高(浪费资源)。 不得已而为之。 - IO操作: 效率高 (浪费资源)。 以后写Python时: IO密集型用多线程: 文件 /输入输出/ socket网络通信 计算密集型用多进程。 扩展: Java多线程情况下: - 计算密集型操作:效率高。 - IO操作: 效率高 Python多进程的情况下: - 计算密集型操作:效率高(浪费资源)。 - IO操作: 效率高 浪费资源)。 python和java多线程使用对比 一、multiprocess模块 仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。

【2020Python修炼记】python并发编程(七)协程

馋奶兔 提交于 2020-04-28 08:41:23
一、什么是协程 引例: import time # 串行执行计算密集型的任务 1.2372429370880127 def func1(): for i in range(10000000 ): i + 1 def func2(): for i in range(10000000 ): i + 1 start_time = time.time() func1() func2() print (time.time() - start_time) 切换 + yield 2.1247239112854004 import time def func1(): while True: 10000000 + 1 yield def func2(): g = func1() # 先初始化出生成器 for i in range(10000000 ): i + 1 next(g) start_time = time.time() func2() print (time.time() - start_time) 串行执行 1、协程: # 单线程实现并发,在应用程序里控制 多个任务的切换+保存状态 # 优点:应用程序级别速度要远远高于操作系统的切换 # 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他的任务都不能执行了 一旦引入协程,就需要检测单线程下所有的IO行为,