python多线程并发

Python核心技术与实战——十八|Python并发编程之Asyncio

…衆ロ難τιáo~ 提交于 2019-12-05 17:03:39
我们在上一章学习了Python并发编程的一种实现方法——多线程。今天,我们趁热打铁,看看Python并发编程的另一种实现方式——Asyncio。和前面协程的那章不太一样,这节课我们更加注重原理的理解。 通过上节课的学习,我们知道在进行I/O操作的时候,使用多线程与普通的单线程比较,效率有了很大的提高,既然这样,为什么还要Asyncio呢? 虽然多线程有诸多优点并且应用广泛,但是也存在一定的局限性: ※多线程运行过程很容易被打断,因此有可能出现race condition的情况 ※线程的切换存在一定的消耗,线程数量不能无限增加,因此,如果I/O操作非常密集,多线程很有可能满足不了高效率、高质量的需求。 针对这些问题,Asyncio应运而生。 什么是Asyncio? Sync VS Async 我们首先来区分一下Sync(同步)和Async(异步)的概念。 ※所谓Sync,是指操作一个接一个的执行,下一个操作必须等上一个操作完成后才能执行。 ※而Async是指不同操作之间可以相互交替执行,如果某个操作被block,程序并不会等待,而是会找出可执行的操作继续执行。 举个简单的例子,我们要做一个报表并用邮件发送给老板,看看两种方式有什么不同: ※按照Sync的方式,我们相软件里输入各项数据,然后等5分钟生成了报表明细以后,再写邮件发送给老板 ※而按照Async的方式,在输完数据以后

python库包大全(转)

你离开我真会死。 提交于 2019-12-05 16:37:38
python 库资源大全 转自: Python 资源大全中文版 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具。 官网 pyenv:简单的 Python 版本管理工具。 官网 Vex:可以在虚拟环境中执行命令。 官网 virtualenv:创建独立 Python 环境的工具。 官网 virtualenvwrapper:virtualenv 的一组扩展。 官网 包管理 管理包和依赖的工具。 pip:Python 包和依赖关系管理工具。 官网 pip-tools:保证 Python 包依赖关系更新的一组工具。 官网 pipenv:Pyhton 官方推荐的新一代包管理工具。 官网 conda:跨平台,Python 二进制包管理工具。 官网 Curdling:管理 Python 包的命令行工具。 官网 wheel:Python 分发的新标准,意在取代 eggs。 官网 包仓库 本地 PyPI 仓库服务和代理。 warehouse:下一代 PyPI。 官网 Warehouse: 预览 bandersnatch:PyPA 提供的 PyPI 镜像工具。 官网 devpi:PyPI 服务和打包 / 测试 / 分发工具。 官网 localshop:本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。 官网 分发 打包为可执行文件以便分发。

Python并发和线程

孤者浪人 提交于 2019-12-05 13:58:06
基本概念 并发和并行的区别 并行,parallel。 同时做某些事,可以互不干扰的同一时刻做几件事。 并发,concurrency 也是同时做某些事,但是强调的是,一个时间段内有事情要处理。 举例 乡村公路一条车道,半幅路面出现了坑,交警指挥交通。众多车辆在这一时刻要通过路面的事件,这就是并发。交警指挥,车辆排队通过另外半幅路面,一个方向放行3分钟,停止该方向通行,换另一个方向放行。 而高速公路的车道,是双向四车道,所有车辆(数据)可以互不干扰的在自己的车道上奔跑(传输),在同一个时刻,每条车道上可能同时有车辆在跑,是同时发生的概念,这是并行。 并发的解决 “食堂打饭模型” 中午12点,开饭啦,大家都涌向食堂,这就是并发,如果人很多,这就是高并发。 1队列、缓冲区 假设只有一个窗口,陆续涌入食堂的人,排队打菜是比较好的方式。所以,排队(队列)是一种天然解决并发的办法。 排队就是把人排成队列,先进先出,解决了资源使用的问题。而排成的队列,其实就是一个缓冲地带,就是缓冲区。 而假设女生优先,那么这个窗口就有两队,只要有女生来就是可以先打饭,男生队列等着,女生队伍就是一个优先队列。 例如queue模块的类Queue,LifoQueue,PriorityQueue。 2争抢 只开一个窗口,有可能没有秩序,也就是谁挤进去就给谁打饭,挤到窗口的人占据窗口,直到打到饭菜离开,其他人继续争抢

Python核心技术与实战——十七|Python并发编程之Futures

微笑、不失礼 提交于 2019-12-05 11:11:25
不论是哪一种语言,并发编程都是一项非常重要的技巧。比如我们上一章用的爬虫,就被广泛用在工业的各个领域。我们每天在各个网站、App上获取的新闻信息,很大一部分都是通过并发编程版本的爬虫获得的。 正确并合理的使用并发编程,无疑会给我们的程序带来极大性能上的提升。今天我们就一起学习Python中的并发编程——Futures。 区分并发和并行 我们在学习并发编程时,常常会听到两个词:并发(Concurrency)和并行(Parallelism)这两个术语。这两者经常一起使用,导致很多人以为他们是一个意思,其实是不对的。 首先要辨别一个误区,在Python中, 并发 并不是只同一时刻上右多个操作(thread或者task)同时进行。相反,在某个特定的时刻上它只允许有一个操作的发生,只不过线程或任务之间会相互切换直到完成,就像下面的图里表达的 在上图中出现了task和thread两种切换顺序的不同方式。分别对应了Python中并发两种形式——threading和asyncio。 对于线程,操作系统知道每个线程的所有信息,因此他会做主在适当的时候做线程切换,这样的好处就是代码容易编写,因为程序员不需要做任何切换操作的处理;但是切换线程的操作,有可能出现在一个语句的执行过程中( 比如X+=1),这样比较容易出现race condiiton的情况。 而对于asyncio

python_多线程多进程

大憨熊 提交于 2019-12-05 07:01:08
进程就是多个资源的集合, 线程是包含在进程里面的,线程和线程直接是相对独立的 线程的优点 1.易于调度。 2.提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 3.开销少。创建线程比创建进程要快,所需开销很少。 4.利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。 def down_load(): time.sleep(5) print('运行完了') # threading.Thread(target=down_load,args=('name','id')#target是函数名,args是函数的参数没有可以不写 t1 = threading.Thread(target=down_load) t1.start()#启动线程 每个子线程都是在主线程里启动的子线程 ====================================================================================== 继承调用 class Test_thread(threading.Thread):#继承threading的Thread类 def __init__(self,num): threading.Thread.__init__(self

14 python学习笔记-多线程threading

…衆ロ難τιáo~ 提交于 2019-12-05 05:31:20
做自动化测试时,测试的case多,单线程执行测试用例,速度慢,执行的时间长;或在使用Pyhotn或Java对服务端进行压力测试的时候,单线程只能模拟单个用户的行为,此时,我们可以引入多线程、多进程去执行测试用例,进行压力测试。 一、进程与线程基本概念 1、进程: 进程(英语:process),是指计算机中已运行的程序。你可以理解成一个任务就是一个进程,比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。进程是很多资源的集合。 2、线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位,是进程里边具体干活的,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。比如Word,它可以同时进行打字、拼写检查、打印等子任务,这些进程内的这些“子任务”称为线程(Thread)。 注:python中的多线程并不是真正意义上的多线程,因为python解释器使用了GIL的全局解释锁 GIL全局解释器锁:不能利用多核CPU,只能运行在一个cpu上面,但是你在运行程序的时候,看起来好像还是在一起运行的,是因为操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒…

python os模块进程管理

邮差的信 提交于 2019-12-05 05:04:57
有两种方式来实现并发性,一种方式是让每个“任务"或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另一个时间片的到来。另一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效,因为操作系统不必为每个线程创建单独的内存空间。 新建进程用os.fork函数。但它只在POSIX系统上可用,在windows版的python中,os模块没有定义os.fork函数。相反,windows程序员用多线程编程技术来完成并发任务。 os.fork函数创建进程的过程是这样的。程序每次执行时,操作系统都会创建一个新进程来运行程序指令。进程还可调用os.fork,要求操作系统新建一个进程。父进程是调用os.fork函数的进程。父进程所创建的进程叫子进程。每个进程都有一个不重复的进程ID号。或称pid,它对进程进行标识。子进程与父进程完全相同,子进程从父进程继承了多个值的拷贝,如全局变量和环境变量。两个进程的唯一区别是fork的返回值。子进程接收返回值0,而父进程接收子进程的pid作为返回值。 用os.fork创建的子进程和父进程作为异步的并发进程而单独执行

Python核心技术与实战——十五|Python协程

拈花ヽ惹草 提交于 2019-12-05 02:28:22
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程。那什么是协程呢? 协程 协程是实现并发编程的一种方式。提到并发,肯很多人都会想到多线程/多进程模型,这就是解决并发问题的经典模型之一。在最初的互联网世界中,多线程/多进程就在服务器并发中起到举足轻重的作用。 但是随着互联网的发展,慢慢很多场合都会遇到C10K瓶颈,也就是同时连接到服务器的客户达到1W,于是,很多代码就跑崩溃,因为进程的上下文切换占用了大量的资源,线程也顶不住如此巨大的压力。这时候,NGINX就带着事件循环闪亮登场了。 事件循环启动一个统一的调度器,让调度器来决定一个时刻去运行哪个任务,于是省却了多线程中启动线程、管理线程、同步锁等各种开销。同一时期的NGINX,在高并发下也能保持资源消耗低、性能高,相比Apache也支持更多的并发连接。 再到后来,出现了一个很有名的名词——回调地狱(callback hell).很多写过JavaScript的朋友明白那是什么。大家惊喜的发现,这种工具很完美的继承了事件循环的优越性,同时还能提供async/await语法糖,解决了执行性和可读性共存的难题。于是,协程渐渐被更多人发现并看好,也有越来越多的人尝试用Node.js做起了后端开发。 回到Python中,使用生成器来实现协程已经是Python2时代的老方法了

python--多线程--多进程--单元测试

夙愿已清 提交于 2019-12-05 00:38:31
一、self的作用 class Person: country = 'China' def __init__(self,name): self.name = name print('内存地址',id(self)) def say(self): print(self.name)xm = Person('小明')print('xm的内存地址',id(xm))xm.say()xh = Person("小红")print('xh的内存地址',id(xh))xh.say()每次实例化的是谁,self 就是谁 二、多线程 import threadingimport time#进程是多个资源的集合。#线程是就是进程里面具体干活的。#线程和线程之间是互相独立的。def down_load(): time.sleep(5) print("运行完了")def movie(): time.sleep(1) print('movie') # threading.Thread(target=down_load,args=('name','abfd'))#启动线程 ,target=函数名,args=(参数1,参数2) t1 = threading.Thread(target=down_load)t1.start()t2 = threading.Thread(target=down_load)t2.start

【python】进程、线程、协程对比

偶尔善良 提交于 2019-12-04 20:44:09
请仔细理解如下的通俗描述 有一个老板想要开个工厂进行生产某件商品(例如剪子) 他需要画一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的为了能够生产剪子而准备的资源称之为:进程 只有生产线是不能够进行生产的,所以老板得找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程 这个老板为了提高生产率,想到了3种办法 在这条生产线上多招些工人,一起来做剪子,这样效率是成倍增长,即单进程多线程方式 老板发现这条生产线上的工人不是越多越好,因为一条生产线的资源以及草料毕竟有限,所以老板又花了些财力物理购置了另外一条生产线,然后再招些工人这样效率又再一步提高了,即多进程,多线程方式 老板发现,现在已经又和很多条生产线,并且每条生产线上已经有很多工人了(即程序是多进程的,每个进程中又有多个线程),为了再次提高效率,老板想了个损招,规定:如果某个员工在上班时没事或者再等待某些条件(比如等待另一个生产完谋道工序之后他才能再次工作),那么这个员工就利用这个时间去做其它的事情,那么也就是说:如果一个线程等待默写条件,可以充分利用这个时间去做其它事情,其实这就是协程方式 简单总结 进程是资源分配的单位 进程是操作系统调度的单位 进程切换需要的资源量最大,效率很低 线程切换需要的资源一般,效率一般(当然了,再不考虑GIL的情况下)