协程

进程池和线程池、协程

岁酱吖の 提交于 2019-11-27 10:19:17
一、进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个。手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池、线程池的功效就能发挥了。我们可以通过维护一个进程池、线程池来控制进程数目和线程数目。在保证计算机硬件安全的情况下最大限度的利用计算机,池其实是降低了程序的运行效率,但是保证了计算机硬件的安全。 注意点:在使用进程池、线程池,Pool可以提供指定数量的进程,线程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程,线程用来执行该请求,但如果池中的进程,线程数量已经达到规定的最大值,那么该请求就会等待,直到池中有进程,线程结束,就重新使用进程池、线程池中的进程,线程。 池子中创建的进程/线程创建一次就不会再创建了,至始至终都是使用最初的那几个,这样的话节省了反复开辟进程/线程的资源(******) 主要方法: pool.submit(task,1) #朝池子中提交任务 异步提交 task是函数,1是task的参数 pool.shutdown() #关闭池子 等待池子中所有任务执行完毕之后才会往下运行代码 线程池和进程池创建的方法一样只是导入的模块不一样 回调函数add_done_callback,我们可以把耗时间(IO操作)的任务放在进程池中,然后指定回调函数(主进程负责执行)

进程池,线程池&协程

荒凉一梦 提交于 2019-11-27 10:18:44
线程池与进程池   池是一个容器的概念,所谓进程池,线程池,就是建立好的进程或线程,在一个容器对象中,且可以重复使用。开启进程与线程都需要消耗资源,两者相比,线程消耗资源更少一些。但是为了能在计算机硬件承受范围内最大限度地利用计算机资源,可以使用线程池与进程池。同时进程池线程池限制了程序云效率,但是保证了计算机安全。   创建线程池与线程池都在concurrent.future模块下ThreadPoolExeutor(线程池),ProcessPoolExecutor(进程池)。首先需要进线程池创建对象,开启进线程时需要用到submit()方法,且都有返回结果,结果对象需要用到result()获取结果。进线程对象都有shutdown()方法关闭对象。 ''' 线程池 两种方式 ''' import time from concurrent.futures import ThreadPoolExecutor # 调用线程池 pool = ThreadPoolExecutor(5) # 创建线程池对象 线程创建个数默认是当前计算cup个数乘以5,现在设定5个 def func(n): print(f'{n}来了') time.sleep(2) return f'{n}走了' t_list = [] for i in range(20): # 开启20个线程 res = pool

进程/线程池、协程、IO模型

偶尔善良 提交于 2019-11-27 10:17:40
进程池和线程池 multiprocessing为我们提供了一个Pool类,来为用户提供指定的进程数量 供用户调用: 1. 当有新的进程提交到Pool时,如果进程池没有满,那么就会创建一个新的进程执行请求, 2. 如果进程池已满,则会让请求先等待,直到有进程结束,才会执行该请求​ 注意: ​池子中创建的进程/线程创建一次就不会再创建了 至始至终用的都是最初的那几个(可以通过查看进程号 来检验) 这样的话节省了反复开辟进程/线程的资源​    通过concurrent.futures实现进程/线程池 # 代码演示(进程/线程池)+(异步回调) ​from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os ​ ​# 默认是当前计算机cpu的个数​,也可以不传 不传默认是当前所在计算机的cpu个数乘5 pool = ThreadPoolExecutor(5) ​ # pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数​ ​ def task(n): print(n,os.getpid()) # 查看当前进程号 time.sleep(2) return n**2​​ ​ def call_back(n): print(

线程进程池,协程,IO模型

牧云@^-^@ 提交于 2019-11-27 10:16:32
1. 线程进程池    1.池: 在保证计算机硬件安全的情况下最大限度的使用计算机硬件,池其实是降低了程序的运行效率,但是保证了计算机硬件的安全(硬件的发展跟不上软件发展的速度)   2: 线程池与进程池: 开线程和进程都需要消耗资源,只不过两者比较情况下线程消耗的资源比较少,使用进程池与线程池能在计算机能承受的范围内最大限度的使用计算机   3: 在python中开线程池与进程池需要导入concurrent.futurs 标准模块 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #submit(fn, *args, **kwargs) 异步提交任务 #map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作 #shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True

进程池和线程池、协程、单线程实现并发

主宰稳场 提交于 2019-11-27 10:14:18
进程池与线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os # pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程池内的线程个数 # # 也可以不传 不传默认是当前所在计算机的cpu个数乘5 pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数 """ 池子中创建的进程/线程创建一次就不会再创建了 至始至终用的都是最初的那几个 这样的话节省了反复开辟进程/线程的资源 """ def task(n): print(n, os.getpid()) # 查看当前进程号 time.sleep(2) return n**2 def call_back(n): print('拿到了异步提交任务的返回结果:',n.result()) """ 提交任务的方式 同步:提交任务之后 原地等待任务的返回结果 期间不做任何事 异步

协程

北战南征 提交于 2019-11-27 10:10:25
一、进程池线程池介绍   1.开线程和开进程都是要消耗资源的,只不过线程消耗的资源较少一点   2.概念:硬件有极限,为了减轻硬件压力,所以有了池的概念   3.什么是池?     在保证计算机硬件安全的情况下最大限度的利用计算机     池其实是降低了程序的运行效率,但是保证了计算机硬件的安全     (硬件的发展跟不上软件的速度)   4.操作步骤     (1)concurrent.futures模块导入     (2)线程池创建(线程数=cpu核数*5左右)     (3)submit提交任务(提交任务的两种方式)     (4)异步提交的submit返回值对象     (5)shutdown关闭池并等待所有任务运行结束     (6)对象获取任务返回值     (7)进程池的使用,验证进程池在创建的时候里面固定有指定的进程数     (8)异步提交回调函数的使用   5.pool = ThreadPoolExecutor(5)  括号内可以传参数指定线程池内的线程个数     也可以不传,默认为当前所在计算机的cpu个数乘5     pool = ProcessPoolExecutor()  默认是当前计算机cpu的个数     add_done_callback()  绑定一个回调函数   6.提交任务的方式:     同步:提交任务之后,原地等待任务的返回结果

协程简介

情到浓时终转凉″ 提交于 2019-11-27 10:08:23
协程简介 进程是资源单位,线程是执行单位,这两者是实际存在的。对于协程,程序员为了解决单线程下IO阻塞的问题,自己定义的。在单线程下,协程通过切换程序以及保存状态的操作,让多个程序看起来是同时执行的,表现出没有IO阻塞的状态。 程序员自己通过代码检测自己写的程序中的IO,一旦遇到IO程序通过代码自己切换,欺骗了操作系统,让操作系统认为这个线程没有IO,保证程序在运行态和就绪态之间来回切换,提升了代码的运行效率。 上述过程的实现是通过切换加保存运行状态的操作实现,但是在该操作下代码的运行效率不一定提升。在密集IO操作下该方法可以提高程序运行效率,但是在计算密集型下代码效率会大大降低。 在python中,yield可以保存上一次的运行状态。上述方法就是基于yield实现的。 为了方便使用,程序员将该方法封装成gevent包,并将该方法命名为协程。 from gevent import monkey;monkey.patch_all() # 由于该模块经常被使用 所以建议写成一行 from gevent import spawn import time """ 注意gevent模块没办法自动识别time.sleep等io情况 需要你手动再配置一个参数 """ def heng(): print("哼") time.sleep(2) print('哼') def ha(): print(

在单线程下利用协程实现服务端并发的效果

可紊 提交于 2019-11-27 10:06:31
import socket from threading import Thread client = socket.socket() client.connect(('127.0.0.1',8080)) def c(client,i): while True: client.send(('hello %s'%i).encode("utf-8")) data = client.recv(1024) print(data.decode('utf-8')) for i in range(400): t = Thread(target=c,args=(client,i)) # 客户端使用多线程实现并发模拟 t.start() 客户端 import socket from gevent import spawn from gevent import monkey; monkey.patch_all() server = socket.socket() server.bind(('127.0.0.1', 8080)) server.listen(5) def talk(conn): while True: try: data = conn.recv(1024) # 等待客户端发消息 阻塞态 if len(data) == 0: break print(data.decode('utf-8')

进程、线程和携程的通俗解释【刘新宇Python】

有些话、适合烂在心里 提交于 2019-11-27 05:58:47
通过下面这张图你就能看清楚了,进程、线程和携程的关系 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行。 每个进程又可以有多个线程,线程是轮询执行的,因为轮询的速度很快,所以可以看成是并行。 携程是微线程,一个线程可以分为多个携程,同样也是轮询执行,这样的好处是减少CPU的资源消耗,一些比较多而且小的事件可以用携程去处理,减少资源的开销。 协程模式 (采⽤用的⽅方案) 协程原理理 ⽣生成器器 def fun1(): print(100) print(200) yield # 暂停代码 保存断点状态 print(100) print(100) * yield 1 2 3 4 5 6 7 8 9 通常采⽤用协程库(扩展库)来完成协程开发 协程库能够⾃自动帮助完成协程的执⾏行行切换 eventlet print(100) print(100) def fun2(): print(100) print(200) yield print(100) print(100) * yield print(100) print(100) gen_obj1 = fun1() # 创建了了⽣生成器器对象 gen_obj2 = fun2() next(gen_obj1) next(gen_obj2) next(gen_obj1) next(gen

python生成器

谁说我不能喝 提交于 2019-11-27 05:55:13
目录 生成器 一、yield关键字 二 、 协同程序 生成器 一、yield关键字 yield的英文单词意识就是生产,在函数中但凡出现yield关键字,在调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) #输出:# generator 生成器 <generator object func at 0x0000019C5C5BD448> 生成器 的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以认为:生成器提供了非常方便的自定义迭代器的途径。并且从python2.5+开始,[PEP 342:通过增强生成器实现协同程序的实现位生成器加入了更多的特性,这意味着,生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(g.__iter__()) print(g.__iter__()==g) res1 = g.__next__() print(res1) res2 = next(g) print(res2) #输出: <generator