协程

进程池 线程池 协程 UTC并发

橙三吉。 提交于 2019-11-27 10:57:50
一、进程、线程池 #为什么用 开进程开线程都需要消耗资源消耗时间的,只不过两者比较的情况线程消耗的资源比较少 在成千上万个任务需要被执行的时候,我们可以去创建成千上万个进程么? 就算你比较二,建了无数个进程线程,系统敢让你执行么?除非它自己不要命了,辛辛苦苦创建出来还不能执行,气不气? 我们需要一个池子,根据计算机状况最大限度的限制进程线程数量,在计算机能够承受范围之内最大限度的利用计算机 #什么是池? (硬件的发展跟不上软件的速度) 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 最大限度的限制进程线程数量,在保证计算机硬件安全的情况下最大限度的利用计算机 #提交任务的方式:           同步: 提交任务之后 原地等待任务的返回结果 期间不做任何事           异步: 提交任务之后 不等待任务的返回结果(异步的结果怎么拿???) 直接执行下一行代码            异步回调机制 :当异步提交的任务有返回结果之后,会自动触发回调函数的执行 #创建的特点 池子中创建的进程/线程创建一次就不会再创建了 至始至终用的都是最初的那几个 这样的话节省了反复开辟进程/线程的资源 1.进程池 池中默认进程数: cpu个数 from concurrent.futures import ProcessPoolExecutor import time import os

协程

自作多情 提交于 2019-11-27 10:55:13
1.进程池与线程池   开线程和开进程都是需要消耗资源的,相对而言,开线程消耗的资源比开进程消耗的资源少。 什么是池?   在保证计算机硬件安全的前提下最大限度的利用计算机。池降低了运行速率来保证计算机硬件的安全。 来源: https://www.cnblogs.com/blue-tea/p/11360606.html

并发编程三

一笑奈何 提交于 2019-11-27 10:45:54
  一.如何用单线程实现并发   二.线程池和进程池   三.协程    了解前提:     进程:资源单位     线程:执行单位     协程:单线程下实现并发     何为并发:       并发的条件:         多道技术           空间上的复用           时间上的复用 切换 + 保存状态       IO切换 + 保存当前状态 yield 保存上一次的结果       多进程下开多线程       多线程下再开协程       ps:并发看起来像是同时执行            可以利用我们的协程 协程实际上是不存在的是我们程序员自己意淫出来的名词为了程序员自己通过代码检测程序中的IO      一旦遇到IO输入自己通过代码进行在内部切换 让操作系统感觉是你这个线程没有任何的IO     ps:欺骗操作系统 让他误以为你这个程序一直没有IO 从而保证程序在运行态和就绪态来回切换 提升代码的运行效率     补充:切换+保存状态就一定能够提升效率???       当你的任务是IO密集型的情况下 可以提升效率       如果是任务是计算密集型 降低效率 不需要切换IO   演示代码: 客户端 # 客户请求 import socket from threading import Thread,current_thread def client1()

进程池、线程池、协程

↘锁芯ラ 提交于 2019-11-27 10:43:33
什么是池? 保证计算机硬件安全的情况下最大限度利用计算机 降低了程序的运行效率,但保证了硬件的安全 受限于硬件的物理极限,硬件的发展跟不上软件的速度,迫不得已提出了池的概念 进程池、线程池 提交任务的方式: 同步:提交任务之后,原地等待任务的返回结果,期间不做任何事 异步:提交任务之后,不等待任务的返回结果(异步的结果怎么拿???),直接执行其他代码 (线程池、进程池) 异步回调机制 (重点):当异步提交的任务有返回结果之后,会自动触发回调函数的执行。 pool.submit(task, 1).add_done_callback(callback回调函数) 线程池、进程池 使用方式大同小异, from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor #创建池 pool = ThreadPoolExecutor(5) # 5 线程个数,也可以不传,默认是CPU个数乘以5 #pool = ProcessPoolExecutor() #进程池不传参数,默认是当前cpu的个数 def task(n): print(n) time.sleep() #提交任务:异步提交 # pool.submit(task, 1) 朝线程池提交任务 #回调机制:pool.submit(task, 1).add_done

Day33 并发编程(三) 线程池进程池,协程

泪湿孤枕 提交于 2019-11-27 10:41:29
1.进程池和线程池   开进程和开线程都需要消耗资源,只不过线程相比进程耗费的资源较小,但是计算机的硬件是有限制的,我们不能无限制的去开启进程或者线程.进程池和线程池能帮助我们在计算机承受的范围内最大限度的利用计算机 什么是池   在保证计算机硬件安全的情况下最大限度的利用计算机   池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 怎么使用池   我们首先定义一个池子,在里边放入固定数量的进程或线程,只要有任务来了,就派一个进程或线程去处理任务,如果固定数量的进程或线程使用完了,那么接下来的任务就在外面等待,直到有进程或线程的任务执行完毕,外面的任务才可以拿到空闲的进程或线程执行,这样我们既可以同时使用多个进程或线程,又可以保证计算机硬件不会因为任务过多而导致死机等情况 注意:池子中的进程或线程的数量是固定的,可以自己定义数量,但是里边的进程或线程是不会动态改变的.例如工厂中有5个工人,一堆任务过来,他们只能同时执行5个,一个工人做完一个任务之后再做另一个任务,任务在变,但是工人是不会变的,即虽然任务在变,但是进程或线程只会创建一次,执行多少任务还是那几个,这样也节省了反复开闭进程线程的时间 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:

进程池,线程池,协程

China☆狼群 提交于 2019-11-27 10:39:20
进程池与线程池 开进程和线程都需要消耗资源,只不过相对一两者比较,线程比较少,在计算机的最大层度的利用计算机 什么是池 在保证计算机硬件的安全情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但保证了计算机的安全(硬件的发展,跟不上软件的速度) from concurrent.futures import ProcessPoolExecutor,HtreadPoolExecutor pool = ProcessPoolExecutor(5) # 开启进程池 # pool = HtreadPoolExecutor(5) # 开启线程池 ​ def func(): i = 0 for i in range(10): print("func") i += 1 return i ​ def call_back(i): print(i.result()) # 注,返回的结果必须使用result() ​ ​ if __name__ == '__main__': pool.submit(func).add_done_callback(call_back) # 添加任务,使用异步回调,将处理结果的函数放入括号类 # 拿到的值会自动的当做参数传入函数中    注意,开线程池和,进程池是一样的。j将ProcessPoolExecutor换成HtreadPoolExecutor就可以了 协程

进程池/线程池 协程

这一生的挚爱 提交于 2019-11-27 10:35:11
进程池/线程池 开进程开线程都需要消耗资源,只不过两者比较的情况下线程的资源消耗的较小 所以我们要在计算机能够承受的范围内最大限度的利用计算机 池 : 在保证计算机硬件的安全情况下最大限度的利用计算机的资源 池其实是江都了程序的运行效率,但是保证了计算机永健的安全 concurrent.futures 模块 pool = ProcessPoolExecutor() 进程池 括号内可以传参数指定进程个数,默认cpu个数 pool = ThreadPoolExecutor() 线程池 括号内可以传参数指定线程个数,默认cpu*5个 池子中创建的进程/线程创建一次就不会创建了,至始至终用的都是最初的默认或自定义的那几个,这样节省了反复开辟进程/线程资源 pool.submit(fn, *args, **kwargs ) 向线程/进程内提交任务 异步提交 from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os import time ​ # 实例化进程池 pool = ProcessPoolExecutor() # 括号内可以传参数指定池的个数,进程池默认是cpu个数 # 实例化线程池 # pool = ThreadPoolExecutor() ​ def task(n): print

上海 day33-- 进程池和线程池、异步回调机制、协程

人走茶凉 提交于 2019-11-27 10:27:56
目 录 进程池和线程池 进程池和线程池的创建 异步回调机制 协程 协程实现TCP服务端并发 IO模型 一、进程池和线程池 什么是池? 池可以理解是一种容器,它其实是降低了程序的运行效率但是提高了计算机的硬件安全,因为硬件的发展跟不上软件的发展速度。 池的作用是什么? 池的作用就是在保证计算机硬件安全的前提下,最大限度的利用计算机。 进程池和线程池? 进程池:我们所允许创建的最大进程数 线程池:我们在一个进程内所允许创建的最大的线程数 注意: 开进程和开线程都会消耗资源,但是两者对比来说开线程所消耗的资源最小,开销最小。 进程池和线程池的本质都是在计算机能够承受的范围内最大限度的利用计算机 二、进程池、线程池的创建和异步回调 使用的模块和方法:    '''  from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor   pool = ThreadPoolExecutor() 创建线程池 注意:参数默认是当前所在计算机的CPU 乘以 5 ,也可以自己指定线程数   pool = ProcessPoolExecutor() 创建进程池 注意: 参数默认是当前计算机的CPU数, 也可以自己指定进程数   pool.submit( task, 1 ) 向进程池或进程池内发送任务, 参数1 是定义的任务函数,

并发编程-协程、池,io模型

↘锁芯ラ 提交于 2019-11-27 10:23:36
一、线程池、进程池   开进程、开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少   在计算机能够承受范围之内最大限度的利用计算机 什么是池?   在保证计算机硬件安全的情况下最大限度的利用计算机   池其实是降低了程序的运行效率,但是保证了计算机硬件的安全   (硬件的发展跟不上软件的速度) # 调用 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor # 建池子 pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数 pool = ThreadPoolExecutor(5) # 括号可穿参数,不传默认代表cpu个数*5 res = pool.submit(task,i).add_done_callback(call_back) # 提交任务,绑定一个回调函数,一旦该任务有结果,立刻执行对于的回调函数 res.result() # 原地等待任务的返回结果 pool.shutdown() # 关闭池子,等待池子中所有的任务执行完毕之后,才会往下运行代码 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor # pool =

三十二、协程与IO模型

浪子不回头ぞ 提交于 2019-11-27 10:22:54
一、协程 进程:启动多个进程 进程之间是由操作系统负责线程:启动多个线程 真正被cpu执行的最小单位实际是线程 开启一个线程 创建一个线程 需要寄存器 堆栈协程:本质上是一个线程,能在多个任务之间切换来节省一些IO时间 协程中任务之间的切换也消耗时间,但是开销远远小于进程线程之间的切换都是实现并发的手段 真正的协程模块就是使用greenlet模块完成的切换 rom greenlet import greenlet def eat(): print("eating start") g2.switch() print("eating end") g2.switch() def play(): print("playing start") g1.switch() print("playing end") g1 = greenlet(eat) g2 = greenlet(play) g1.switch() 二、gevent模块 """一般最大限度可以开: 进程 线程 协程 5 20 500 最多可以实现5w个并发""" 注意gevent模块没办法自动识别time.sleep等io情况需要你手动再配置一个参数 from gevent import monkey;monkey.patch_all() # 识别所有IO操作,在导入gevent模块之前 import gevent import