python多线程并发

Python 基础之 I/O 模型

女生的网名这么多〃 提交于 2019-11-29 07:07:18
一、事件驱动模型介绍 1、传统的编程模式 例如:线程模式大致流程 开始--->代码A--->代码B--->代码C--->代码D--->......--->结果 每一个代码里是完成各种各样事情的代码,但编程者知道代码A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据。输入不同的数据, 根据条件语句判断,流程或许就改为A--->B--->D...--->结束。 每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和你编写的程序决定的。如果你知道这个程序当前的运行状态(包括输入 数据和程序本身),那你就知道接下来甚至一直到结束它的运行流程。 例如:事件驱动程序模型大致流程 开始--->初始化--->等待 与上面传统编程模式不同,事件驱动程序在驱动之后,就在那等待,等待什么呢?等待被事件触发。传统编程下也有“等待”,比如在 编代码D中,你定以了一个input(),你作为程序编写者是知道或者强制用户输入东西的,或许是数字,或许是文件名称,如果用户输入 错误,你还需要提醒他,并请他重新输入,事件驱动程序的等待则是完全不知道,也不强制用户输入或者干什么,只要某一事件 发生,那程序就会做出相应的“反应”。这些事件包括:输入信息、鼠标、敲击键盘上某个键还有系统内部定时器触发。 2、事件驱动模型 通常,我们写服务器处理模型的程序时,有一下几种模型: (1)每收到一个请求;创建一个新的进程

Python爬虫-01:爬虫的概念及分类

笑着哭i 提交于 2019-11-29 04:03:31
目录 # 1. 为什么要爬虫? 2. 什么是爬虫? 3. 爬虫如何抓取网页数据? # 4. Python爬虫的优势? 5. 学习路线 6. 爬虫的分类 6.1 通用爬虫: 6.2 聚焦爬虫: # 1. 为什么要爬虫? “大数据时代”,数据获取的方式: 大型企业公司有海量用户,需要收集数据来提升产品体验 【百度指数(搜索),阿里指数(网购),腾讯数据(社交)】 数据管理咨询公司: 通过数据团队专门提供大量数据,通过市场调研,问卷调查等 政府/机构提供的公开数据 中华人民共和国统计局 World bank Nasdaq 第三方数据平台购买数据 数据堂 贵阳大数据交易平台 爬虫数据 2. 什么是爬虫? 抓取网页数据的程序 3. 爬虫如何抓取网页数据? 首先需要了解网页的三大特征: 每个网页都有自己的 URL (统一资源定位符)来定位 网页都使用 HTML (超文本标记语言)来描述页面信息 网页都使用 HTTP/HTTPS (超文本传输协议)来传输HTML数据 爬虫的设计思路: 首先确定需要爬取的网 URL 地址 通过 HTTP/HTTPS 协议来获取对应的 HTML 页面 提取 HTML 页面内有用的数据: a. 如果是需要的数据--保存 b. 如果有其他 URL ,继续执行第二步 # 4. Python爬虫的优势? 语言 优点 缺点 PHP 世界上最好的语言 对多线程,异步支持不好

python并发编程之多线程(实践篇)

孤人 提交于 2019-11-29 03:20:15
一.threading模块介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 1.开启线程的两种方式 #直接调用 import threading import time def run(n): print('task',n) time.sleep(2) t1 = threading.Thread(target=run,args=('t1',)) t1.start() #继承式调用 mport threading import time class MyThread(threading.Thread): def __init__(self,n,sleep_time): super(MyThread, self).__init__() self.n = n self.sleep_time = sleep_time def run(self): print('running task',self.n) time.sleep(self.sleep_time) print('task done,',self.n) t1 = MyThread('t1',2) t1.start() 2. 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 from threading import

python爬虫并发并行下载

半世苍凉 提交于 2019-11-29 01:32:20
1一百万个网站 1用普通方法解析Alexa列表 2复用爬虫代码解析Alexa列表 2串行爬虫 3并发并行爬虫 0并发并行工作原理 1多线程爬虫 2多进程爬虫 4性能对比 这篇将介绍使用多线程和多进程这两种方式并发并行下载网页,并将它们与串行下载的性能进行比较。 1一百万个网站 亚马逊子公司Alexa提供了最受欢迎的100万个网站列表( http://www.alexa.com/topsites ),我们也可以通过 http://s3.amazonaws.com/alexa-static/top-1m.csv.zip 直接下载这一列表的压缩文件,这样就不用去提取Alexa网站的数据了。 排名 域名 1 google.com 2 youtube.com 3 facebook.com 4 baidu.com 5 yahoo.com 6 wikipedia.com 7 google.co.in 8 amazon.com 9 qq.com 10 google.co.jp 11 live.com 12 taobao.com 1.1用普通方法解析Alexa列表 提取数据的4个步骤: - 下载.zip文件; - 从.zip文件中提取出CSV文件; - 解析CSV文件; - 遍历CSV文件中的每一行,从中提取出域名数据。 # -*- coding: utf-8 -*- import csv from

【Python爬虫4】并发并行下载

醉酒当歌 提交于 2019-11-29 01:30:52
文章目录 1一百万个网站 1.1用普通方法解析Alexa列表 1.2复用爬虫代码解析Alexa列表 2串行爬虫 3并发并行爬虫 3.0并发并行工作原理 3.1多线程爬虫 3.2多进程爬虫 4性能对比 这篇将介绍使用多线程和多进程这两种方式并发并行下载网页,并将它们与串行下载的性能进行比较。 1一百万个网站 亚马逊子公司Alexa提供了最受欢迎的100万个网站列表( http://www.alexa.com/topsites ),我们也可以通过http://s3.amazonaws.com/alexa-static/top-1m.csv.zip 直接下载这一列表的压缩文件,这样就不用去提取Alexa网站的数据了。 排名 域名 1 google.com 2 youtube.com 3 facebook.com 4 baidu.com 5 yahoo.com 6 wikipedia.com 7 google.co.in 8 amazon.com 9 qq.com 10 google.co.jp 11 live.com 12 taobao.com 1.1用普通方法解析Alexa列表 提取数据的4个步骤: 下载.zip文件; 从.zip文件中提取出CSV文件; 解析CSV文件; 遍历CSV文件中的每一行,从中提取出域名数据。 # -*- coding: utf-8 -*- import

Python之并发编程(九)线程队列、Event事件、协程

回眸只為那壹抹淺笑 提交于 2019-11-28 22:53:51
线程队列、Event事件、协程 线程队列 先进先出示例: import queue #不需要通过threading模块里面导入,直接import queue就可以了,这是python自带的 #用法基本和我们进程multiprocess中的queue是一样的 q=queue.Queue() q.put('first') q.put('second') q.put('third') # q.put_nowait() #没有数据就报错,可以通过try来搞 print(q.get()) print(q.get()) print(q.get()) # q.get_nowait() #没有数据就报错,可以通过try来搞 ''' 结果(先进先出): first second third ''' 先进后出(Lifo堆栈)示例: import queue q=queue.LifoQueue() #队列,类似于栈,栈我们提过吗,是不是先进后出的顺序啊 q.put('first') q.put('second') q.put('third') # q.put_nowait() print(q.get()) print(q.get()) print(q.get()) # q.get_nowait() ''' 结果(后进先出): third second first ''' 优先级队列示例 import

python高级编程——线程和线程池

给你一囗甜甜゛ 提交于 2019-11-28 22:38:49
线程模块 线程的特点: 本质上是异步的、需要多个并发活动、每个活动的处理顺序可能是不确定的、或者说是随机的,不可预测的,宏观上是同时运行的 进程与线程的关系: 多任务可以由多进程完成,也可以由一个进程内的多线程完成,进程有若干个线程组成,一个进程至少有一个线程。在使用线程的过程中一般建议使用threading模块,相比于_thread高级一些。很多地方线程和进程是一样的 threading模块的Thread类: 属性: name ------>名字 ident ------->线程标识符 daemon ------->守护线程的标识,类型bool 方法:__init__构造函数,和进程的构造函数差不多,可以参考进程的构造函数 start:线程启动 run:定义线程功能方法,一般是在子类重新定义的 join:在启动线程终止前一直挂起,timeout是阻塞时间 使用Thread类创建线程的三种方法:(直接看实例) ①创建Thread类实例,传给他一个函数 # 1、创建Thread类实例,传给它一个函数 # 线程的属性和方法 def task(task_id, task_time): print("start task", task_id, "at", ctime()) sleep(task_time) print("task", task_id, "done at", ctime())

并发编程之多线程

半腔热情 提交于 2019-11-28 22:27:48
并发编程之多线程 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('太白',)) t.start() print('主线程') #方式二 from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print('%s say hello' % self.name) if __name__ == '__main__': t = Sayhi('egon') t

百万年薪python之路 -- 并发编程之 协程

拜拜、爱过 提交于 2019-11-28 18:42:09
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换。     ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 一:其中上图的第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换

python_高级进阶(5)协程_事件

孤人 提交于 2019-11-28 18:20:51
线程queue 第一种、先进先出 import queue q = queue.Queue(3) q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print(q.get()) print(q.get()) print(q.get(block=False)) q.get(timeout=2) # 阻塞2s 还没有值直接报错 结果: #1 #2 #3 ##第二种、后进先出 Lifo 堆栈 q = queue.LifoQueue(4) q.put(1) q.put(2) q.put('alex') q.put('太白') print(q.get()) print(q.get()) print(q.get()) print(q.get()) 结果: 太白 alex 2 1 第三种、优先级队列 q = queue.PriorityQueue(4) q.put((5, '元宝')) q.put((-2,'狗狗')) q.put((0, '李业')) print(q.get()) print(q.get()) print(q.get()) 结果: (-2, '狗狗') (0, '李业') (5, '元宝') 事件event 开启两个线程,一个线程运行到中间的某个阶段,触发另一个线程执行,两个线程增加了耦合性 版本一