python多线程并发

python基础(35):协程

非 Y 不嫁゛ 提交于 2019-12-04 17:35:02
1. 前言 之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。 随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。 为此我们需要先回顾下并发的本质:切换+保存状态。 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长。 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 : 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。 为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级

python基础(34):线程(二)

不想你离开。 提交于 2019-12-04 16:39:53
1. python线程 1.1 全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行。虽然 Python 解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行。 对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。 在多线程环境中,Python 虚拟机按以下方式执行: 设置 GIL 切换到一个线程去运行 运行指定数量的字节码指令或者线程主动让出控制(可以调用 time.sleep(0)) 把线程设置为睡眠状态 解锁 GIL 再次重复以上所有步骤 在调用外部代码(如 C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(由于在这期间没有Python的字节码被运行,所以不会做线程切换)编写扩展的程序员可以主动解锁GIL。 1.2 python线程模块的选择 Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。

python基础(33):线程(一)

Deadly 提交于 2019-12-04 16:35:17
1. 线程概念的引入背景 1.1 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。 1.2 为什么要有线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 如果这两个缺点理解比较困难的话,举个现实的例子也许你就清楚了:如果把我们上课的过程看成一个进程的话,那么我们要做的是耳朵听老师讲课,手上还要记笔记,脑子还要思考问题,这样才能高效的完成听课的任务。而如果只提供进程这个机制的话

Python3 多线程

半腔热情 提交于 2019-12-04 12:14:32
本文是 Comyn 老师 Python 多线程课程的笔记,感谢老师优质的课程! 两个概念: 并发:假同时,一段时间内同时处理多个任务,单核都可以; 并行:真同时,同时处理多个任务,必须多核。 主流操作系统上完成并发的手段有进程和线程,主流的编程语言提供了用户空间的调度:协程。Python 也不例外。 由于现在的操作系统上的进程越来越轻量,导致进程和线程之间的区别越来越少。事实上,Linux 并没有原生的线程,线程是通过进程实现的。 python 中每一个进程会启动一个解释器,而线程会共享一个解释器。 Python 中的线程是通过标准库 threading 实现的。而启动一个线程就是让这个线程执行一些逻辑,这些逻辑就对应一个函数。 >>> import threading >>> def worker(): # 让多个线程来执行它 ... print('work') ... >>> thread = threading.Thread(target=worker) # 创建了一个线程对象,target 参数是一个函数,即线程要执行的逻辑 >>> thread.start() # start 启动一个线程,执行完毕后,自动退出,Python 没有提供主动退出线程的方法 work 由于 python 没有提供退出线程的方法,因此我们一定不能在逻辑中定义死循环,不然线程无法退出。当然直接

python学习笔记之---多进程

我与影子孤独终老i 提交于 2019-12-04 05:42:27
首先,思考多进程、多线程、协程的区别? 其次,什么时候该用哪种模式? 进程:一个程序在计算机里面的一次运行。 线程:进程中调度执行的最小单位。 多进程:利用多核cpu,硬件的计算能力变强了。 程序的计算要求比较高的时候。 多线程:一核cpu,硬件的计算能力变弱了。 不是强调计算能力,而是强调多io操作的时候。(什么是IO?输入,输出:从键盘接收一个东西叫输入,打印一个东西叫输出) 多个线程之间做切换,比协程的切换效率要低一些。 协程: 本质是单线程,比多线程的效率高 单线程来实现不同任务的切换,是任务本身来实现的。 多io操作。 多进程编程会比多线程编程麻烦:因为多进程之间是无法共享一个变量的,多线程之间可以共享变量(同一个进程里)的使用,比较麻烦。 什么时候该用哪种模式呢? 计算密集型的任务时使用多进程,多核cpu计算效率更高 做多io操作的时候用线程或者协程都可以,但是对于多io来说协程的效率比多线程更高一些,不过同时协程的复杂度也比多线程更高一些 区别是什么? 线程必须运行在进程里面,一个进程至少有一个线程。 进程是操作系统分配资源的最小单位。 一个进程中的不同线程,会共用一个进程中的资源。 并发和并行什么区别: 并发:一起执行,并不一定是在某一时刻就同时执行 并行:在同一时刻执行。 多进程、多线程、协程都是用来提升并发性的。 同步:注册和登录,必须按同步是按顺序执行

【第一天】自学Python:明确未来选择方向,深挖提升能力

蹲街弑〆低调 提交于 2019-12-04 01:14:17
最近我已经接触了Python有一周了,对python也有一些初步的了解,也写了一些简单的代码,比如简单爬虫、消费模型的编写、数据报表的统计这块。我感觉学习python实现的方式很简单,入门门槛比较低,但成为高手还需要很长的一段路。 对于一门新学的技术,我还是想通过博客的方式记录每天学习的进度,这样可以了解自己可以学到什么地步,自己离目标还差多少。 刚开始我也在网上找了很多学习入门途径去学习,有全栈开发的、有后端开发、网站开发、数据分析的、模型设计等等很多,我看到这些我觉得挺懵逼的,不知道如何去选择。 我觉得任何一门技术,他的本质是为市场服务的,而你要学习的话,一定要先明确你的方向,再来主攻技术,那学习的效果会事半功倍。 一:看市场需要 岗位一:爬虫工程师 工作1-3年:8- 15k, 工作3-5年:15-50k不等 岗位二:数据分析岗位 岗位三:后端技术开发 岗位四:WeB应用开发 这四个方向为目前市面上主流的,也是我们普通人主要的选择,但也有一些AI、算法岗位也有,这个需要看你的天赋。 二:岗位的技能要求 看完了岗位,我们看看这些岗位需要掌握什么样的技术能力 岗位一:爬虫工程师 1-3年的工作职责: 熟悉html/css/xpath/ajax/xml等技术 精通网页抓取原理和整合技术 熟悉正则表达式 熟悉Scrapy爬虫框架   熟悉MySQL/MongoDB

python的多线程和多进程(一)

白昼怎懂夜的黑 提交于 2019-12-03 10:01:52
在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行。但任一时刻点上只有一个程序在处理机上运行。形象的点描述:一个人做很多事情,但同一时刻只能做一件事情。 --并行:当系统有一个CPU时,则程序的操作有可能非并发。当一个CPU执行一个程序时,另一个CPU可以执行另一个程序,两个程序互不抢占CPU资源,可以同时进行。形象的描述:多人同时做多件事情 可能有小伙伴又会问串行又是什么鬼呢?再来唠叨一下: 串行和并行是数据传输方式的区别。其实和并发和并行的概念是两个领域: 1、数据传输方式不同,串行口传输方式为数据排成一行,一位一位送出,接受也是一样。并行口传输8位数据一次送出。 2、针脚不同,串行口针脚少,并行口针脚多 3、用途不同,串行口现在只用作控制接口,并行口多用作打印机、扫描仪等接口。 来吧,进入正题: 进程的概念:计算机程序其实只是存储在磁盘上可执行的二进制(或其他可执行的类型)文件。只有把它们加载到内存中并被操作系统调用,才算是被执行,并用拥有生命周期。所以说进程是一个执行中的程序。 每个进程都拥有自己的地址空间,内存,数据栈以及其他用于跟踪执行的辅助数据。 此间,操作系统管理其上的所有进程的执行,并为这些进程合理分配时间。 多进程

多线程与多进程的理解

匿名 (未验证) 提交于 2019-12-03 00:40:02
参考https://www.liaoxuefeng.com/ 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 在 Unix / Linux 下,可以使用 fork ()调用实现多进程。 要实现跨平台的多进程,可以使用 multiprocessing 模块。 进程间通信是通过 Queue 、 Pipes 等实现的 多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 因为 Python 的线程虽然是真正的线程,但解释器执行代码时,有一个 GIL 锁: Global Interpreter Lock ,任何 Python 线程执行前,必须先获得 GIL 锁,然后,每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行。这个 GIL 全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在 Python 中只能交替执行,即使 100 个线程跑在 100 核 CPU 上,也只能用到 1 个核。 不过,也不用过于担心,

Python常用的标准库以及第三方库有哪些?

匿名 (未验证) 提交于 2019-12-02 22:56:40
20个必不可少的Python库也是基本的第三方库 读者您好。今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们。他们是: Requests.Kenneth Reitz写的最富盛名的http库。每个Python程序员都应该有它。 Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的。用过它之后你就不会再想用别的同类库了。 wxPython.Python的一个GUI(图形用户界面)工具。我主要用它替代tkinter。你一定会爱上它的。 Pillow.它是PIL(Python图形库)的一个友好分支。对于用户比PIL更加友好,对于任何在图形领域工作的人是必备的库。 SQLAlchemy.一个数据库的库。对它的评价褒贬参半。是否使用的决定权在你手里。 BeautifulSoup.我知道它很慢,但这个xml和html的解析库对于新手非常有用。 Twisted.对于网络应用开发者最重要的工具。它有非常优美的api,被很多Python开发大牛使用。 NumPy.我们怎么能缺少这么重要的库?它为Python提供了很多高级的数学方法。 SciPy.既然我们提了NumPy,那就不得不提一下SciPy。这是一个Python的算法和数学工具库,它的功能把很多科学家从Ruby吸引到了Python。 matplotlib.一个绘制数据图的库

python 多线程

匿名 (未验证) 提交于 2019-12-02 22:56:40
(一)基础概念线程:是程序执行流的最小单元(线程内部可开线程)、每一个程序都至少有一个线程、线程共享统一进程中的所有资源。 进程:是最小的资源单元(内存资源的分配与调度)线程共享进程中的资源,(每个进程中至少有一个线程(QQ\360)) 并发:是指系统具有执行多个任务(动作)的能力并行:是指系统具同一时刻进行多个任务(动作)的能力(是并发子集) 线程与进程关系:一个程序至少有一个进程、每个进程中至少有 一个线程 (1)线程的创建(threading接口) (1)线程的创建(threading接口) 1.自己创建线程 # sampleOne import threading import time def Hi(name): print("Hello %s" %name) time.sleep(3) if __name__=="__main__": t1 = threading.Thread(target=Hi,args=("萌萌",)) t1.start() t2 = threading.Thread(target=Hi, args=("蒙蒙",)) t2.start() print("end")    2)线程的调用方式 2.创建线程类继承threading.Thread类下的方法 class Mythread(threading.Thread): def __init__