python多线程并发

python的GIL锁

荒凉一梦 提交于 2019-12-02 03:48:13
进程:系统运行的一个程序,是系统分配资源的基本单位。 线程:是进程中执行运算的最小单位,是处理机调度的基本单位。 处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口。 程序:程序是描述处理机完成某任务的指令序列。 指令:处理机能够解释、直接执行的信息单位。 计算机系统:处理机+外围设备。 并行:多个cpu同时执行多个任务,假设有两个程序,这两个程序在两个不同的cpu上同时运行。 并发:单个cpu交替执行多个任务,假设有两个程序,这两个在该cpu上交替进行运行,而不是同时运行,只是由于执行的时间太快,让人误以为是在“同时进行”。执行的先后取决于对时间片资源的竞争。其中两种并发关系是同步和互斥。 同步: 不是指同时进行 , 指线程之间按一定 顺序 进行运行,当前一个线程结束时,下一个线程才能够运行。 异步:线程不可以同时进行运行。 (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。 (3)处理机分给线程,即真正在处理机上运行的是线程

python基于redis实现分布式锁

自闭症网瘾萝莉.ら 提交于 2019-12-01 23:55:15
阅读目录    什么事分布式锁   基于redis实现分布式锁   一、什么是分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图: 上图可以看到,变量A存在三个服务器内存中(这个变量A主要体现是在一个类中的一个成员变量,是一个有状态的对象),如果不加任何控制的话,变量A同时都会在分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的!即使不是同时发过来,三个请求分别操作三个不同内存区域的数据,变量A之间不存在共享,也不具有可见性,处理的结果也是不对的! 如果我们业务中确实存在这个场景的话,我们就需要一种方法解决这个问题! 为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题! 分布式锁应该具备哪些条件:  

Python开发之路

爷,独闯天下 提交于 2019-12-01 13:59:31
第一部分 MarkDown 基本语法 001 Markdown 基本语法 第二部分 Python集成环境和解释器 002 Python解释器 003 Python解释器源修改 004 pip的使用 005 Python的IDE之Pycharm的使用 006 Python的IDE之Jupyter的使用 第三部分 计算机基础 007 计算机的基础编程 008 计算机组成.md 009 计算机操作系统 010 编程语言的分类 第四部分 Python基础 011 执行Python程序的两种方式 012 变量 013 常量 014 Python变量的内存管理 015 变量的三个特征 016 花式赋值 017 注释 018 数据的类型 019 解压缩,用户交互 020 格式化输出的三种方式 021 基础运算符 022 程序流程控制if判断 023 程序流程控制while判断 024 程序流程控制for循环 025 数字类型内置方法.md 026 字符串类型内置方法 027 列表类型内置方法 028 元组的内置方法 029 字典的内置方法 030 集合的内置方法 031 数据类型分类 032 深浅拷贝 033 异常处理 第五部分 文件处理 034 基本的文件处理 035 绝对路劲和相对路径 036 字符编码 037 Python2和Python3字符编码的区别 038 文件的三种打开方式 039

Python多任务之进程

限于喜欢 提交于 2019-12-01 09:57:42
Process多进程 进程的概念 程序是没有运行的代码,静态的; 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称; 程序只有一个,但同一份程序可以有多个进程;例如,电脑上多开QQ; 程序和进程的区别在于有没有资源,进程有资源而程序没有资源,进程是一个资源分配的基本单元; 程序在没运行的时候没有资源,没有显卡,没有网卡,等等;双击运行后有摄像头,有网速等等,就叫做进程; 进程的状态 进程状态图 就绪态:运行的条件都已经慢去,正在等在cpu执行 执行态:cpu正在执行其功能 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态 使用Process完成多任务 进程的使用步骤和线程的使用步骤基本一致; 进程的使用步骤: 导入multiprocessing; 编写多任务所所需要的函数; 创建multiprocessing.Process类的实例对象并传入函数引用; 调用实例对象的start方法,创建子线程。 进程使用步骤图示: 进程使用步骤代码 import time import multiprocessing def sing(): while True: print("-----sing-----") time.sleep(1) def dance(): while True: print("-----dance-----") time.sleep(1)

python多线程并发

送分小仙女□ 提交于 2019-12-01 09:03:25
1、循环创建多个线程,并通过循环启动执行 import threading from datetime import * from time import sleep # 单线程执行 def test(): print('hello world') t = threading.Thread(target=test) t.start() # 多线程执行 def test_01(): sleep(1) x = 0 while x == 0: # 设置一个死循环 print(datetime.now()) # 获取当前系统时间 def looptest(): ''' 循环20次执行 test_o1()函数 :return: ''' for i in range(20): test_01() def thd(): ''' 创建并执行多个线程 需求:并发执行50次 test_o1()函数 说明:把50的并发拆成25个线程组,每个线程再循环20次执行 test_o1()函数,这样在启动下一个线程的时候, 上一个线程已经在循环了,以此类推,当启动第25个线程的时候,可能已经执行了200次的t est_o1()函数, 这样就可以大大减少并发的时间差异 :return: ''' Threads = [] for i in range(25): th = threading.Thread(target

【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)

二次信任 提交于 2019-12-01 08:31:37
GIL锁 计算机有4核,代表着同一时间,可以干4个任务。如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的。但是单核永远肯定时串行的,它肯定是串行的,cpu真正执行的时候,因为一会执行1,一会执行2.。。。。正常的线程就是这个样子的。但是,在python中,无论有多少核,永远都是假象。无论是4核,8核,还是16核.......不好意思,同一时间执行的线程只有一个(线程),它就是这个样子的。这个是python的一个开发时候,设计的一个缺陷,所以说python中的线程是假线程。 1、 全局解释器锁(GIL)  无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行 2、GIL存在的意义?  因为python的线程是调用操作系统的原生线程,这个原生线程就是C语言写的原生线程。因为python是用C写的,启动的时候就是调用的C语言的接口。因为启动的C语言的远程线程,那它要调这个线程去执行任务就必须知道上下文,所以python要去调C语言的接口的线程,必须要把这个上限问关系传给python,那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程1,再让线程2.......  每个线程在执行的过程中,python解释器是控制不了的,因为是调的C语言的接口,超出了python的控制范围

Python线程

半城伤御伤魂 提交于 2019-12-01 07:06:44
线程,有时被称为轻量进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程不拥有私有的系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。Python多线程用于I/O操作密集型的任务,如SocketServer网络并发,网络爬虫。 现代处理器都是多核的,几核处理器只能同时处理几个线程,多线程执行程序看起来是同时进行,实际上是CPU在多个线程之间快速切换执行,这中间就涉及到上下问切换,所谓的上下文切换就是指一个线程Thread被分配的时间片用完了之后,线程的信息被保存起来,CPU执行另外的线程,再到CPU读取线程Thread的信息并继续执行Thread的过程。 线程模块 Python的标准库提供了两个模块:_thread和threading。_thread 提供了低级别的、原始的线程以及一个简单的互斥锁,它相比于 threading 模块的功能还是比较有限的。Threading模块是

2-6 GIL全局解释器锁

江枫思渺然 提交于 2019-12-01 06:46:48
一 引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) 结论:在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。>有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL

(转)Python多任务之线程

穿精又带淫゛_ 提交于 2019-12-01 02:08:34
https://www.cnblogs.com/yifchan/p/python-1-41.html 多任务介绍 我们先来看一下没有多任务的程序 import time def sing(): for i in range(5): print("我喜欢唱") time.sleep(1) def dance(): for i in range(5): print("我喜欢跳") time.sleep(1) def main(): sing() dance() pass if __name__ == "__main__": main() 运行结果:花了十秒钟多,只能按顺序执行,无法一起/同步执行 我喜欢唱 我喜欢唱 我喜欢唱 我喜欢唱 我喜欢唱 我喜欢跳 我喜欢跳 我喜欢跳 我喜欢跳 我喜欢跳 我们再来看一下使用了多线程的程序 import time import threading def sing(): for i in range(5): print("我喜欢唱歌") time.sleep(1) def dance(): for i in range(5): print("我喜欢跳舞") time.sleep(1) def main(): t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance)

python 学习目录

人走茶凉 提交于 2019-11-30 23:23:11
python基础 python基础一 pytcharm安装详细教程 python基础二 python基础数据类型 Python最详细,最深入的代码块小数据池剖析 深浅copy python基础数据类型补充以及编码进阶 python文件操作 python函数 python函数初识 python函数进阶 python迭代器(函数名的应用,新版格式化输出) 生成器,内置函数Ⅰ 匿名函数,内置函数II,闭包 python装饰器 python模块 自定义模块 模块I 软件开发规范 模块 模块与包 python面向对象 01 面向对象之:初识 02 面向对象之:类空间问题以及类之间的关系 03 面向对象之:继承 04 面向对象之:继承(以讲),封装,多态 05 面向对象之:类的成员 06 面向对象之:反射,双下方法 异常处理 网络编程 操作系统详解 网络协议篇(osi七层协议) 网络编程 并发编程 操作系统发展史 python并发编程之:多进程(理论部分) python并发编程之:多进程 python并发编程之:多线程(理论部分) python并发编程之:多线程 python并发编程之:协程 python额外知识学习 python递归函数 python二分查找算法 print输出带颜色方法 pycharm安装详细教程 面向对象开发原则:高内聚,低耦合 来源: https://www