python多线程并发

Python之网络编程目录

爷,独闯天下 提交于 2019-11-30 18:05:59
Python之网络编程目录 源自路飞学城,网络编程部分师从Egon。 1、网络编程基础      1.1 网络编程之C/S架构      1.2 网络编程之TCP/IP各层详解      1.3 网络编程之Socket      1.4 网络编程之Socket代码实例      1.5 网络编程之粘包现象与解决方案 2、并发编程——多进程      2.1 网络编程之并发编程——操作系统介绍      2.2 网络编程之并发编程——进程理论      2.3 网络编程之并发编程——开启进程的两种方式      2.4 网络编程之并发编程——多进程中的join方法      2.5 网络编程之并发编程——守护进程      2.6 网络编程之并发编程——互斥锁      2.7 网络编程之并发编程——队列      2.8 网络编程之并发编程——生产者消费者模型 3、并发编程——多线程      3.1 网络编程之多线程——线程理论      3.2 网络编程之多线程——开启多线程的两种方式      3.3 网络编程之多线程——多线程与多进程的区别      3.4 网络编程之多线程——守护线程      3.5 网络编程之多线程——Thread对象的其他属性或方法      3.6 网络编程之多线程——GIL全局解释器锁      3.7 网络编程之多线程——死锁现象与递归锁  

进程和线程,线程安全,python如何实现多进程,多线程

梦想与她 提交于 2019-11-30 13:32:16
进程和线程的区别 进程是对运行时程序的封装,是系统资源调度和分配的基本单位 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发。 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存 什么是线程安全 一个线程的修改被另一个线程的修改覆盖掉。 python中哪些操作是线程安全的 一个操作可以在多线程环境中使用,并且获得正确的结果。 线程安全的操作线程是顺序执行的而不是并发执行的。 一般涉及到写操作需要考虑如何让多个线程安全访问数据。 线程同步的方式 互斥量(锁): 通过互斥机制防止多个线程同时访问公共资源。 信号量(Semphare): 控制同一时刻多个线程访问同一个资源的线程数。 ps:python的threading 文档 事件(信号): 通过通知的方式保持多个线程的同步。 进程间的通信方式 (IPC:Inter-Process Communication 进程间传递信号或者数据) 管道/匿名管道/有名管道(pipe) 信号(Signal):比如用户使用ctrl+c产生SIGINT程序终止信号 消息队列(Message) 共享内存(share memory) 进程间的信号量(Semaphore) 套接字(socket):最常用的方式,我们的web应用就是这种方式 多线程的例子 # python实现多线程 import threading lock =

网络编程之多线程——GIL全局解释器锁

a 夏天 提交于 2019-11-30 12:55:43
网络编程之多线程——GIL全局解释器锁 一、引子 定义: 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执行环境来执行

Python从入门到放弃

余生长醉 提交于 2019-11-30 06:21:38
第一篇 markdown编辑器 001 markdown基本语法 第二篇 计算机基础 002 计算机基础之编程 003 计算机组成原理 004 计算机操作系统 005 编程语言分类 006 网络的瓶颈效应 007 计算机基础小结 第三篇 Python解释器和集成环境 008 Python和Python解释器 009 Python解释器安装 010 Anaconada安装(选做) 011 Python解释器镜像源修改 012 执行Python程序的两种方式 013 Python的IDE之Pycharm的使用 014 Python的IDE之Jupyter的使用 015 pip的使用 016 Python解释器和Python集成环境小结 第三篇 Python基础 017 变量 018 常量 019 Python变量内存管理 020 变量的三个特征 021 花式赋值 022 注释 023 数据类型基础 024 数字类型 025 字符串类型 026 列表类型 027 字典类型 028 布尔类型 029 解压缩 030 Python与用户交互 031 格式化输出的三种方式 032 基本运算符 033 流程控制之if判断 034 流程控制之while循环 035 流程控制之for循环 036 Python基础小结 037 Python基础实战之猜年龄游戏 第四篇 Python进阶 038

python之多线程

和自甴很熟 提交于 2019-11-30 04:10:29
线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务,就是线程 线程又被称为轻量级进程(lightweight process),是更小的执行单元 一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源 一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快 线程和进程的区别 进程是系统进⾏资源分配和调度的⼀个独⽴单位 进程在执⾏过程中拥有独⽴的内存单元, ⽽多个线程共享内存, 从⽽极⼤地提⾼了程序的运⾏效率 ⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程 线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位 线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源,但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源 线程的划分尺度⼩于进程(资源⽐进程少), 使得多线程程序的并发性⾼ 线程不能够独⽴执⾏, 必须依存在进程中 线程和进程在使⽤上各有优缺点: 线程执⾏开销⼩, 但不利于资源的管理和保护; ⽽进程正相反 threading模块

Python多进程和多线程是鸡肋嘛?【转】

雨燕双飞 提交于 2019-11-30 04:10:27
GIL是什么 Python的代码执行由 Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行。即每个CPU在任意时刻只有一个线程在解释器中运行。对 Python虚拟机访问的控制由全局解释锁GIL控制,正是这个锁来控制同一时刻只有一个线程能够运行。——在单核CPU下的多线程其实都只是并发,不是并行 。 并发与并行区别 并发:两个或多个事件在同一时间间隔发生,或者说交替做不同事件的能力,或者说不同的代码块交替执行。 并行:两个或者多个事件在同一时刻发生,或者说同时做不同事件的能力,或者说不同的代码块同时执行。 并发和并行的意义 并发和并行都可以处理“多任务”,二者的主要区别在于是否是“同时进行”多个的任务。但是涉及到任务分解(有先后依赖耦合度高的任务无法做到并行)、任务运行(可能要考虑互斥、锁、共享等)、结果合并。 Python 下的多线程 在Python多线程下,每个线程的执行方式,如下: 获取GIL 切换到这个线程去执行 运行代码,这里有两种机制: 指定数量的字节码指令(100个) 固定时间15ms线程主动让出控制 把线程设置为睡眠状态 释放GIL 再次重复以上步骤 在Python2中,在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行(同一时间只会有一个获得了 GIL 的线程在跑

124 并发编程小结

不羁岁月 提交于 2019-11-30 03:37:01
目录 一、到底什么是线程?什么是进程? 二、Python多线程情况下: 三、Python多进程的情况下: 四、为什么有这把GIL锁? 五、Python中线程和进程(GIL锁) 六、为什么要创建线程? 七、为什么要创建进程? 八、进程和线程的区别? 九、线程创建的越多越好吗? 十、生产者消费者模型解决了什么问题? 十一、Lock和RLock的区别? 十二、进程和线程以及协程的区别? 十三、IO多路复用作用? 十四、socket默认是否是阻塞的?阻塞体现在哪里? 十五、什么是异步非阻塞? 十六、什么是同步阻塞? 十七、什么是协程? 十八、协程可以提高并发吗? 十九、提高并发方案: 二十、单线程提供并发 20.1 基于IO多路复用+socket非阻塞 20.2 协程+IO切换:gevent 20.3 基于事件循环的异步 20.3.1 方法一 20.3.2 方法二 20.4 基于事件循环的异步非阻塞框架 一、到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程。 二、Python多线程情况下: 计算密集型操作:效率低,Python内置的一个全局解释器锁,锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度,多线程无法利用多核优势,可以通过多进程方式解决,但是比较浪费资源。 IO操作:效率高 三、Python多进程的情况下:

python高级串写

旧街凉风 提交于 2019-11-30 03:24:18
TCP和UDP的区别: UDB:是面向无连接的通信协议,包含目标端口号和源端口号 优点:传输速度快 缺点:传输给对方不需要建立连接,对方收到文件没有确认信号,发送端不知数据是否接收。不能从新发送数据,不可靠。 TCP:是面向字节流可靠的传输通信协议,三次握手后建立连接,传输后完成四次挥手 优点:TCP有窗口、确认、重传、阻塞等机制,保证了数据的确认性 缺点:传输速度要比UDP慢 什么是三次挥手四次握手 三次握手: 1.客户端向服务端发送一个带有SYN标志,随机生成序号为100的报文 2.服务端收到这个请求,并发送SYN200、ACK1001的报文给客户端 3.客户端收到请求,再向服务端发送一个SYN200的报文给客户端 四次挥手:因为TCP连接是双向通信(全双工),需要每个方向都单独关闭通信连接 1.客户端向服务端发送一个fin的报文,请求关闭客户端通信 2.服务端收到这个请求,回复一个ACK报文并答应关闭 3.服务端向客户端发送一个fin报文,请求关闭服务端通信 4.客户端收到这个请求,回复一个ACK报文并答应关闭 同步和异步 同步:是指多个任务同时运行 异步:是指多个任务在执行的时候没有先后顺序 并行和并发 并行:同一时刻内多个任务同时运行 并发:同一时间间隔内多个任务同时运行,但不会同一时间运行,有交替顺序 阻塞和非阻塞 阻塞:就是卡住了调用者,不能继续往下执行 非阻塞

python爬虫之线程池和进程池

天涯浪子 提交于 2019-11-30 03:19:40
python爬虫之线程池和进程池 一、需求   最近准备爬取某电商网站的数据,先不考虑代理、分布式,先说效率问题(当然你要是请求的太快就会被封掉,亲测,400个请求过去,服务器直接拒绝连接,心碎),步入正题。一般情况下小白的我们第一个想到的是for循环,这个可是单线程啊。那我们考虑for循环直接开他个5个线程,问题来了,如果有一个url请求还没有回来,后面的就干等,这么用多线程等于没用,到处贴创可贴。 二、性能考虑   确定要用多线程或者多进程了,那我们到底是用多线程还是多进程,有些人对多进程和多线程有一定的偏见,就因为python的GIL锁,下面我们说一下这两个东西的差别。 三、多线程:   一般情况下我们启动一个.py文件,就等于启动了一个进程,一个进程里面默认有一个线程工作,我们使用的多线程的意思就是在一个进程里面启用多个线程。但问题来了,为什么要使用多线程呢?我知道启动一个进程的时候需要创建一些内存空间,就相当于一间房子,我们要在这个房子里面干活,你可以想一个人就等于一个线程,你房子里面有10个人的空间跟有20个人的空间,正常情况下是不一样的,因为我们知道线程和线程之间默认是可以通信的(进程之间默认是不可以通信的,不过可以用技术实现,比如说管道)。可以多线程为了保证计算数据的正确性,所以出现了GIL锁,保证同一时间只能有一个线程在计算。GIL锁你可以基本理解为

【转载】Go对比Python的优点

妖精的绣舞 提交于 2019-11-29 23:33:10
Go对比Python的优点如下 【转载自知乎Rio】: 一、部署简单。 Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和 Python 有着巨大的区别。由于历史的原因, Python 的部署工具生态相当混乱,比如 setuptools,、istutils 、ip、buildout 的不同适用场合以及兼容性问题。官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。 二、并发性好。 Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。这和 Python 也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战(我们用的 supervisor 管理进程,对 fork 支持不好)。部署 Python 应用的时候通常是每个 CPU 核部署一个应用