python 多线程、多进程、协程性能对比(以爬虫为例)
基本配置:阿里云服务器低配,单核2G内存
首先是看协程的效果:
import requests
import lxml.html as HTML
import sys
import time
import gevent
from gevent import monkey
monkey.patch_all() # create url
urls = []
for i in range(int(sys.argv[1]),int(sys.argv[2])):
url = 'http://grri94kmi4.app.tianmaying.com/songs?page='+str(i)
urls.append(url) def get_data(url):
t1 = time.time()
res = requests.get(url)
if res.status_code == 200:
print(url+' : '+'url open success'+' time use: '+ str(time.time()-t1))
html = HTML.fromstring(res.content)
trs = html.xpath('//tbody/tr')
data = []
for tr in trs:
s = {}
s['name'] = tr.xpath('./td/a/text()')[0]
s['url'] = tr.xpath('./td/a/@href')[0]
s['id'] = s['url'][30:]
s['comment'] = tr.xpath('./td[last()]/text()')[0]
data.append(s) if __name__ == '__main__':
total = time.time()
task = []
for url in urls:
task.append(gevent.spawn(get_data,url))
gevent.joinall(task)
print('total time use :', time.time()-total)
在爬取20个链接的情况下,用时为4s:
total time use : 4.873192071914673
线程和进程差不多 ,用时6s左右
import requests
import lxml.html as HTML
import sys
import time
from multiprocessing import Pool as ThreadPool
# create url
urls = []
for i in range(int(sys.argv[1]),int(sys.argv[2])):
url = 'http://grri94kmi4.app.tianmaying.com/songs?page='+str(i)
urls.append(url) def get_data(url):
t1 = time.time()
res = requests.get(url)
if res.status_code == 200:
print(url+' : '+'url open success'+' time use: '+ str(time.time()-t1))
html = HTML.fromstring(res.content)
trs = html.xpath('//tbody/tr')
data = []
for tr in trs:
s = {}
s['name'] = tr.xpath('./td/a/text()')[0]
s['url'] = tr.xpath('./td/a/@href')[0]
s['id'] = s['url'][30:]
s['comment'] = tr.xpath('./td[last()]/text()')[0]
data.append(s) if __name__ == '__main__':
total = time.time()
pool = ThreadPool()
results = pool.map(get_data,urls)
pool.close()
pool.join()
print('total time use :', time.time()-total)
python 多线程、多进程、协程性能对比(以爬虫为例)的更多相关文章
- 多线程 多进程 协程 Queue(爬虫代码)
快速理解多进程与多线程以及协程的使用场合和特点 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运 ...
- Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO 1. 多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- 也说性能测试,顺便说python的多进程+多线程、协程
最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下 一.分析接口频率 根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以 ...
- python 多进程,多线程,协程
在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源.使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能.python实现并行任务可以有多进程,多线程,协程等方式. ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
- Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型
一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python进程、线程、协程的对比
1. 执行过程 每个线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制.每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该 ...
随机推荐
- zoj3765Lights(splay)
链接 splay的增删改操作. 刚开始对于某段区间首先有了lazy标记时,把其左右孩子给交换了,导致在pushup时又交换了一次而debug了n久. #include <iostream> ...
- 安装MySQLdb出现HAVE_WCSCOLL重定义问题的解决方法
root@wodeyitian MySQL-python-1.2.3]# python setup.py install running install running bdist_egg runni ...
- NF!=1
NF表示列数,不等于1表示列数不为1列
- JavaEE汇总
1.简述Spring. a) Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,其目的是解决企业应用开发的复杂性,能够使用基本的JavaBean代替EJB,并提供了 ...
- codevs 4165 高精度求阶乘
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 白银 Silver 题目描述 Description 用高精度计算出S=n! 其中"!"表示阶乘,例如:5!= ...
- 获取显示设备的名称及PNPDeviceID
实现效果: 知识运用: ManagementObjectSearcher类和ManagementObject类 实现代码: private void button1_Click(object send ...
- 6.python
最早的'密码本' ascii 涵盖了英文字母大小写,特殊字符,数字.01010101ascii 只能表示256种可能,太少,创办了万国码 unicode 16表示一个字符不行,32位表示一个字符. A ...
- shell脚本,怎么实现每次新开一个shell都输出一个提示语?
[root@localhost wyb]# cat test.sh echo -e "\033[32mhello,This is wangyuebo's shell\033[0m" ...
- CS193p Lecture 11 - UITableView, iPad
UITableView 的 dataSource 和 delegate dataSource 是一种协议,由 UITableView 实现,将 Model 的数据给到 UITableView: del ...
- css去除链接 input 虚框
/* css去掉虚框 */ :focus{-webkit-outline-style:none;-moz-outline-style:none;-ms-outline-style:none;-o-ou ...