python多线程并发

百万年薪python之路 -- 并发编程之 多线程 二

独自空忆成欢 提交于 2019-11-28 16:25:50
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理。 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用下,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程称为死锁进程 # 多个线程多个锁可能会产生死锁 from threading import Thread from threading import Lock import time lock_A = Lock() lock_B = Lock() class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self): lock_A.acquire() print(f'{self.name}拿到A锁') lock_B.acquire() print(f'{self.name}拿到B锁') lock_B.release() lock_A.release() def f2(self): lock_B.acquire() print(f'{self.name}拿到B锁') time.sleep(0.1) lock_A.acquire() print(f'{self.name}拿到A锁') lock_A.release() lock

python学习_多进程

家住魔仙堡 提交于 2019-11-28 15:08:19
1、基础知识:    计算机的硬件组成:     主板 固化(寄存器,是直接和cpu进行交互的硬件)     cpu 中央处理器:计算(数字计算和逻辑计算) 和控制(控制所有的硬件协调工作)     存储 硬盘 内存     输入设备 键盘 鼠标 话筒     输出设备 显示器 音响 打印机   早期的计算机是以计算为核心的,现在的计算机是以存储为核心的   操作系统是一个软件 是一个能直接操作硬件的一个软件   操作系统的目标:让用户使用更加轻松,高可用,低耦合,封装了所有硬件的接口,使用户更方便的使用,对于计算机内的所有资源,进行一个合理的调度和分配   进程相关基础知识:     进程:正在执行的程序,是程序执行过程中的相关指令,数据集等的集合,也可以叫做程序的一次执行过程,是一个动态的概念     进程的组成:代码段 数据段 PCB:进程控制块     进程的三大基本状态:       就绪状态:已经获得了运行所需要的所有资源,除了cpu       执行状态:已经获得了所有资源,包括cpu,处于正在执行的状态       阻塞状态:因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程处于内存中,继续等待获取cpu       一个特殊状态:挂起状态,因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程被踢出内存 2、进程  

【Python与线程】

北城以北 提交于 2019-11-28 14:55:31
原文: http://blog.gqylpy.com/gqy/232 目录 一、全局解释器锁GIL 二、Python线程模块的选择 三、线程的创建 三、锁机制 四、信号量 五、事件 六、条件 七、定时器 八、线程队列 九、线程池 补充:线程安全 import threading obj = threading.local()# local():可实现,多线程操作某一数据,不会出现数据混乱的情况# 原理:空间换时间 def add(i): obj.n = i print(i, obj.n, threading.current_thread().ident) for i in range(20): th = threading.Thread(target=add, args=(i,)) th.start() 一、全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中同时只有一个线程在执行。虽然Python解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行. 对于Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁保证了同一时刻只有一个线程在运行. 同一时间点,GIL只允许同一个进程中的一个线程访问cpu,即CPython解释器中没有真正的线程并行,只有进程可以实现。故I

python数据结构和GIL及多进程

你离开我真会死。 提交于 2019-11-28 14:45:07
一 数据结构和GIL 1 queue 标准库queue模块,提供FIFO的queue、LIFO的队列,优先队列 Queue 类是线程安全的,适用于多线程间安全的交换数据,内部使用了Lock和Condition 为什么说容器的大小不准确,其原因是如果不加锁,是不可能获取到准确的大小的,因为你刚读取了一个大小,还没取走,有可能被就被其他线程修改了,queue类的size虽然加了锁,但是依然不能保证立即get,put就能成功,因为读取大小和get,put方法是分来的。 2 GIL 1 简介 全局解释器锁,进程级别的锁GIL Cpython在解释器进程中有一把锁,叫做GIL全局解释器锁。 GIL 保证Cpython进程中,当前时刻只有一个线程执行代码,甚至在多核情况下,也是如此。 2 IO 密集型和CPU密集型 Cpython中 IO 密集型,由于线程阻塞,就会调度其他线程 CPU密集型,当前线程可能连续获取GIL,导致其他线程几乎无法使用CPU,若要唤醒其他线程,则需要准备数据,其代价是高昂的。 IO 密集型,多线程解决,CPU密集型,多进程解决,绕开GIL。 python中绝大多数内置数据结构的读写操作都是原子操作 由于GIL 的存在,python的内置数据类型在多线程编程的时候就变得安全了,但是实际上他们本身不是线程安全类型的 3 保留GIL 原因 Guido坚持的简单哲学

Python 最常见的 170 道面试题解析:2019 最新

可紊 提交于 2019-11-28 13:08:50
原文: http://blog.gqylpy.com/gqy/478 置顶:来自一名75后老程序员的武林秘籍——必读 (博主推荐) 来,先呈上武林秘籍链接: http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我会画原理图,会画 PCB,会模拟,会数字!玩过 PLC,玩过单片机,会用汇编,会用 C!玩过 ARM,比如 PLC,STM32,和时下正在起飞的 NXP RT1052!搞过 DSP,比如 TMS320F28335!搞过 FPGA,不管 Xilinx 还是 Altera,也不管是 Verilog 还是 VHDL,或者直接画数字电路图!我懂嵌入式系统,比如 uCOS 和 Linux!我懂开源的硬件,比如 Arduino 和树莓派!我也搞软件,学了一堆上位机的语言C#,JAVA,Python,Kotlin,Swift!会写爬虫工具,又自学写APP,不管Android 还是 IOS! 可是这一切有什么用呢?土鸡瓦狗!不值一提!干技术的永远就是最苦逼的那个人! 我相信看到这里的你,应该是个 IT

python多任务编程---线程

99封情书 提交于 2019-11-28 12:49:12
线程编程(Thread) 什么是线程 线程被称为轻量级的进程 线程也可以使用计算机多核资源,是多任务编程方式 线程是系统分配内核的最小单元 线程可以理解为进程的分支任务 线程特征 一个进程中可以包含多个线程 线程也是一个运行行为,消耗计算机资源 一个进程中的所有线程共享这个进程的资源 多个线程之间的运行互不影响各自运行 线程的创建和销毁耗资源小于进程 各个进程也有自己的ID等特征 threading模块创建线程 创建线程对象 from threading import Thread t = Thread() 功能:创建线程对象 参数:target 绑定线程函数 args 元组 给线程函数位置传参 kwargs 字典 给线程函数键值传参 启动线程 t.start() 回收线程 t.join([timeout]) 线程基础使用示例: 1 import threading 2 from time import sleep 3 import os 4 5 a = 1 6 7 # 线程函数 8 def music(): 9 global a 10 print("a = ",a) 11 a = 10000 12 for i in range(3): 13 sleep(2) 14 print(os.getpid(),"播放: 葫芦娃") 15 16 # 线程对象 17 t = threading

Python 进程

一曲冷凌霜 提交于 2019-11-28 11:29:32
安装Python的paramiko模块 步骤: 1:管理员方式打开cmd,切换到python安装路径的Scripts目录下: 2:执行命令: 1 pip3. 5.exe install paramiko 3.安装过程中可能会报错: 执行以下命令更新下pip,然后继续第一步安装就哦了 线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 2.python GIL全局解释器锁(仅需了解) 无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行 首先需要明确的一点是 GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL

python进程、多进程

大城市里の小女人 提交于 2019-11-28 11:28:46
进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 进程是一个内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据。 进程状态: 创建、就绪、运行、阻塞、结束 进程的概念主要有两点: 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时

Python库大全,建议收藏留用!

社会主义新天地 提交于 2019-11-28 11:11:24
学Python,想必大家都是从爬虫开始的吧。毕竟网上类似的资源很丰富,开源项目也非常多。 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 当我们在浏览器中输入一个url后回车,后台会发生什么? 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址。 向IP对应的服务器发送请求。 服务器响应请求,发回网页内容。 浏览器解析网页内容。 那么学习爬虫需要掌握哪些库呢? 通用: urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库(基于pycurl)。 pycurl – 网络库(绑定libcurl)。 urllib3 – Python HTTP库,安全连接池、支持文件post、可用性高。 httplib2 – 网络库。 RoboBrowser – 一个简单的、极具Python风格的Python库,无需独立的浏览器即可浏览网页。 MechanicalSoup -一个与网站自动交互Python库。 mechanize -有状态、可编程的Web浏览库。 socket – 底层网络接口(stdlib)。 Unirest for Python – Unirest是一套可用于多种语言的轻量级的HTTP库。 hyper – Python的HTTP/2客户端。 PySocks – SocksiPy更新并积极维护的版本

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

可紊 提交于 2019-11-28 09:41:20
目录 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 2.死锁现象与递归锁 2.1死锁现象 2.2递归锁 3.信号量 4.GIL全局解释器锁 4.1背景 4.2为什么加锁 5.GIL与Lock锁的区别 6.验证计算密集型IO密集型的效率 6.1 IO密集型 6.2 计算密集型 7.多线程实现socket通信 7.1服务端 7.2客户端 8.进程池,线程池 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 #生产者消费者模型. # 生产者: 产生数据, # 消费者: 接收数据并做下一步处理 # 容器: 队列. #进程, 线程: # 进程就是资源单位,线程就是执行单位. #进程与线程的区别: # 线程: 开销小,速度快,同一个进程下的线程资源内存级别共享. # 进程: 开销巨大,速度慢, 不同进程的数据内存级别不共享. #join: 阻塞, # t1.join() 阻塞. # print('主') #getname, setname .name #activeCount() 线程的数量 守护线程: 如果守护线程的生命周期小于其他线程,则他肯定先结束,否则等待其他非守护线程和主线程结束之后结束. #互斥锁,锁 2.死锁现象与递归锁 #递归锁可以解决死锁现象,业务需要多个锁时,先要考虑递归锁 2.1死锁现象