python多线程

day33-2 协程

妖精的绣舞 提交于 2020-01-04 05:07:51
目录 协程 单线程实现并发 greenlet模块实现并发 gevent模块实现并发 协程与线程比较 协程 由于GIL锁导致在Cpython中多线程无法并行执行,只能并发执行。而并发实现的原理是切换+保存,那就意味着使用多线程实现并发,就需要为每一个任务创建一个线程 问题一:必然增加了线程创建销毁与切换带来的资源开销。 问题二:高并发情况下,由于任务数量太多导致无法开启新的线程,使得即没有实际任务要执行,也无法创建新线程来处理新任务的情况 所以应想办法避免创建线程带来的问题,同时又能保证并发效果, 协程就是使用单线程来实现多任务并发 单线程实现并发 并发 = 切换任务+保存状态。python中的生成器就具备这样一个特点,每次调用next都会回到生成器函数中执行代码,并且是基于上一次运行的结果,这就意味着生成器会自动切换任务并保存执行状态 def task1(): while True: yield print('task1 run') def task2(): g = task1() while True: next(g) print('task2 run') task2() 并发虽然实现了,但是效率如何呢? # 两个计算任务:一个采用生成器切换并发执行,一个直接串行调用 import time def task1(): a = 0 for i in range(50000000):

协程

有些话、适合烂在心里 提交于 2020-01-04 05:07:42
引子 上一节中我们知道GIL锁将导致CPython无法利用多核CPU的优势,只能使用单核并发的执行。很明显效率不高,那有什么办法能够提高效率呢? 效率要高只有一个方法就是让这个当前线程尽可能多的占用CPU时间,如何做到? 任务类型可以分为两种 IO密集型 和 计算密集型 对于计算密集型任务而言 ,无需任何操作就能一直占用CPU直到超时为止,没有任何办法能够提高计算密集任务的效率,除非把GIL锁拿掉,让多核CPU并行执行。 对于IO密集型任务任务,一旦线程遇到了IO操作CPU就会立马切换到其他线程,而至于切换到哪个线程,应用程序是无法控制的,这样就导致了效率降低。 如何能提升效率呢?想一想如果可以监测到线程的IO操作时,应用程序自发的切换到其他的计算任务,是不是就可以留住CPU?的确如此 一、单线程实现并发 单线程实现并发这句话乍一听好像在瞎说 首先需要明确并发的定义 并发:指的是多个任务同时发生,看起来好像是同时都在进行 , 实际上是切换 + 记录状态 并行:指的是多个任务真正的同时进行 早期的计算机只有一个CPU,既然CPU可以切换线程来实现并发,那么为何不能在线程中切换任务来并发呢? 上面的引子中提到,如果一个线程能够检测IO操作并且将其设置为非阻塞,并自动切换到其他任务 , 就这样可以提高CPU的利用率,指的就是在单线程下实现并发。 如何能够实现并发呢 ? 并发 = 切换任务

python数据采集与多线程效率分析

好久不见. 提交于 2020-01-04 04:54:00
以前一直使用PHP写爬虫,用 Snoopy 配合 simple_html_dom 用起来也挺好的,至少能够解决问题。 PHP一直没有一个好用的多线程机制,虽然可以使用一些trick的手段来实现并行的效果(例如借助apache或者nginx服务器等,或者fork一个子进程,或者直接动态生成多个PHP脚本多进程运行),但是无论从代码结构上,还是从使用的复杂程度上,用起来都不是那么顺手。还听说过一个 pthreads 的PHP的扩展,这是一个真正能够实现PHP多线程的扩展,看github上它的介绍:Absolutely, this is not a hack, we don't use forking or any other such nonsense, what you create are honest to goodness posix threads that are completely compatible with PHP and safe ... this is true multi-threading :) 扯远了,PHP的内容在本文中不再赘述,既然决定尝试一下Python的采集,同时一定要学习一下Python的多线程知识的。以前一直听各种大牛们将Python有多么多么好用,不真正用一次试试,自己也没法明确Python具体的优势在哪,处理哪些问题用Python合适。

进程线程协程的区别

断了今生、忘了曾经 提交于 2020-01-04 04:52:05
一、概念   1、进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。   2、线程 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。   3、协程 协程是一种用户态的轻量级线程, 协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。 二、区别:   1、进程多与线程比较 线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别: 1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间 2)

进程,线程和协程 并行与并发

喜欢而已 提交于 2020-01-04 04:45:13
一、进程 进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有: 地址空间 全局变量 文件描述符 各种硬件资源 相比线程和协程,进程是比较重量级的,它需要的资源很多。进程之间不共享内存变量,所以进程间的通信方式也多种多样: TCP REDIS等数据库 管道,文件等 二、线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使得进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容

python-进程和线程

南笙酒味 提交于 2020-01-04 04:44:36
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。 真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务

异步编程与多线程编程的联系和区别

ⅰ亾dé卋堺 提交于 2020-01-03 07:00:10
参考网址:https://blog.csdn.net/qq_27825451/article/details/78853119    1、异步编程与多线程的区别 共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 不同点: (1)线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线 程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现 (2)异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完 全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序 主要使用回调方式进行处理,与普通人的思维方式有些 初入,而且难以调试。 这里有一个疑问。异步操作没有创建新的线程,我们一定会想,比如有一个文件操作,大量数据从硬盘上读取,若使用单线程的同步操作自然要等待会很长时间,但是若使用异步操作的话,我们让数据读取异步进行,二线程在数据读取期间去干其他的事情,我们会想,这怎么行呢

异步编程与多线程编程的联系和区别

若如初见. 提交于 2020-01-03 06:59:48
1、异步编程与多线程的区别 共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 不同点: (1)线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线 程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现 (2)异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完 全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序 主要使用回调方式进行处理,与普通人的思维方式有些 初入,而且难以调试。 这里有一个疑问。异步操作没有创建新的线程,我们一定会想,比如有一个文件操作,大量数据从硬盘上读取,若使用单线程的同步操作自然要等待会很长时间,但是若使用异步操作的话,我们让数据读取异步进行,二线程在数据读取期间去干其他的事情,我们会想,这怎么行呢,异步没有创建其他的线程,一个线程去干其他的事情去了,那数据的读取异步执行是去由谁完成的呢?实际上,本质是这样的。

python多线程学习

人盡茶涼 提交于 2020-01-03 03:57:14
理解不深,先这样! # -*- coding: utf-8 -*- # usr/bin/python3.6.7 # @idea :PyCharm # @FileName :moreTh.py # @Time :2020/1/2 10:59 # @Author :zzq import time from threading import Thread , Lock from queue import Queue class ThOne ( Thread ) : def __init__ ( self , obj , que ) : super ( ThOne , self ) . __init__ ( ) self . count = que self . obj = obj def run ( self ) : print ( "线程一开始" ) while True : num = self . count . get ( ) num += 1 self . count . put ( num ) time . sleep ( 2 ) print ( num , self . name ) if num > 10 : break print ( "线程一运行完成" ) class ThTwo ( Thread ) : def __init__ ( self , obj ,

day43-线程概念

南楼画角 提交于 2020-01-02 23:25:24
#1、进程:程序不能单独运行,要将程序加载到内存当中,系统为它分配资源才能运行,而这种执行的程序就是进程。 #程序和进程的区别在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 #在多道编程中,允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发的执行。这样可以大大提高cpu的利用率, # 所以进程就是为了在cpu上实现多道编程而提出的。 #2、进程的两个缺点:1、一个进程只能在一个时间干一件事,如果想干两件事或多件事,进程就无能为力了。 # 2、进程在执行过程中如果阻塞,例如等待输入,整个进程就会挂起,即使有些工作不依懒于输入的数据,也将无法执行。 #3、进程是资源分配的最小单位,线程是cpu调度的最小单位,每一个进程中至少有一个线程。 #4、开启时间:开启进程的时间长,开启线程的时间短。 # 切换:cpu在进程之间切换慢,在线程之间切换快。 #如果两个任务(qq和微信),需要数据隔离,又想实现异步:多进程。 #如果一个任务,分成两部分执行,需要内存共享,又想实现异步:多线程。 #5、进程和线程简单而基本靠谱的定义如下: # 1. 进程:程序的一次执行 # 2. 线程:CPU的基本调度单位 #6、进程和线程的类比: # 1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 # 2.假定工厂的电力有限