day37
今日内容
1.线程池和进程池
2.利用线程池实现套接字并发通信
3.协程(利用模块gevent模块,实现单线程下套接字并发通信)
1.线程池与进程池
要用线程池与进程池,首先要导入concurrent.futures这个模块,线程池和进程池规定了产生的线程或者进程的个数,保证计算机不会因为产生过多的进程和线程而导致崩溃,因为如果一台计算机他只能开启500个进程,而现在有1000个任务要运行,若我们让原本只能开启500个进程的计算机现在为了提高效率而开启了1000个进程同时执行这1000个任务,那么计算机会因为开启进程太多而崩溃,所以我们需要通过进程池或者线程池来控制产生的进程或者线程,否则一旦计算机崩溃了,又怎么谈得上效率问题,所以其实站在这个角度,实际上线程池和进程池也是一个提高效率的操作
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import requests,time def task(url):
res = requests.get(url)
if res.status_code == 200:
return res.text
else:
return '下载失败' def parse(future):
print('%s处理数据后:%s'%(current_thread().name,len(future.result()))) if __name__ == '__main__':
urls = [
'https://www.baidu.com/',
'https://www.sina.com.cn/',
'https://www.24luxiang.com/',
'https://nba.hupu.com/',
'https://www.baidu.com/',
'https://www.sina.com.cn/',
'https://www.24luxiang.com/',
'https://nba.hupu.com/',
]
start = time.time()
pool = ThreadPoolExecutor(3)
for url in urls:
pool.submit(task,url).add_done_callback(parse)
pool.shutdown(wait = True)
print(time.time()-start)
2.利用线程池和进程池实现套接字并发通信
客户端:
from socket import *
from concurrent.futures import ThreadPoolExecutor def Sever(IP,PORT,backlog=5):
sever = socket(AF_INET,SOCK_STREAM)
sever.bind((IP,PORT))
sever.listen(backlog)
return sever def communication(future):
conn = future[0]
client_address = future[1]
while True:
try:
data = conn.recv(1024)
if len(data) == 0: break
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
print('%s断开连接'%client_address[1])
conn.close()
break
except OSError:
print('%s断开连接' % client_address[1])
conn.close()
break if __name__ == '__main__':
sever = Sever('192.168.13.131',8080)
pool = ThreadPoolExecutor(3)
while True:
conn, client_address = sever.accept()
res = (conn, client_address)
print('%s客户端已经连接服务器' % client_address[1])
pool.submit(communication,res)
客户端:
from socket import * client = socket(AF_INET,SOCK_STREAM)
client.connect(('192.168.13.131',8080)) while True:
msg = input('输入>>:').strip()
if len(msg) == 0:continue
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
3.协程(利用模块gevent模块,实现单线程下套接字并发通信)
首先应该来重申一下并发的含义(看起来多个任务在同时执行),其实并发的原理是线程获取cpu执行权限执行python代码,当遇到io操作或者长时间占用cpu执行权限的情况下会被操作系统强行剥夺走给别的线程使用,所以我们要实现单线程下套接字并发通信,我们就是要模拟操作系统的这个操作,而现在我们有一个geven模块帮我们封装好了这个功能,利用协程尽量降低io操作这样可以使效率有大幅的提升,并且其实单一一个线程就可以实现高并发,大大提升了计算机的并发能力。
客户端:
from gevent import monkey;monkey.patch_all()
from gevent import spawn
from socket import * def communion(conn):
while True:
try:
data = conn.recv(1024)
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
break
conn.close() def task():
sever = socket(AF_INET, SOCK_STREAM)
sever.bind(('127.0.0.1', 8080))
sever.listen(5)
while True:
conn,address = sever.accept()
spawn(communion,conn)
if __name__ == '__main__':
g1 = spawn(task)
g1.join()
客户端:
from socket import *
from threading import Thread,current_thread
def task():
client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
n=0
while True:
msg = '%shello%s'%(current_thread().name,n)
n+=1
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8')) if __name__ == '__main__':
for i in range(500):
p = Thread(target=task)
p.start()
day37的更多相关文章
- day37 爬虫2(web微信、高性能相关、Scrapy)
s16day37 爬虫2 参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html 课堂代码:https://github.com/liyon ...
- day37——阻塞、非阻塞、同步、异步
day37 阻塞.非阻塞.同步.异步 进程运行的三个状态:运行.就绪.阻塞 执行的角度 阻塞:程序运行时,遇到了IO,程序挂起,CPU被切走 非阻塞:程序没有遇到IO,程序遇到IO但是我通过某种手段, ...
- 如风一样,飞翔------Day37
我一直都觉得自己是个反应没有那么敏锐的人,而不幸的是其实也是,所以,在菜鸟的头衔上,我不得不再背负上一个笨鸟的"光芒".我不苛求一飞冲天的传奇,却也有着不甘寂寞的激昂,我选择先飞, ...
- 分布式监控系统开发【day37】:需求讨论(一)
本节内容 为什么要做监控? 常用监控系统设计讨论 监控需求讨论 如何实现监控服务器的水平扩展? 监控系统架构设计 一.为什么要做监控? 熟悉IT监控系统的设计原理 开发一个简版的类Zabbix监控系统 ...
- 分布式监控系统开发【day37】:表结构设计(二)
一.表结构关系图 二.表结构需求讨论 1.主机表(Host) 1.解决了什么问题? 1.如果我不想让它监控了,就有一个开关的东西给它禁掉2.主机存活状态检测间隔 2.代码 class Host(mod ...
- 分布式监控系统开发【day37】:填充表配置项目(三)
一.注册站点初始化数据库 1.目录结构 2.初始化数据库 python3 manage.py makemigrations python3 manage.py migrate #django2.0之前 ...
- 分布式监控系统开发【day37】:服务端生成配置数据(四)
一.目录结构 二.引子与代码 1.客户端获取服务列表接口 1.解决了什么问题 客户端要给我获取服务列表的的时候,他肯定要告诉他是谁?他怎么告诉我,客户端必须有一个id号 Saltsack你装一个客户端 ...
- 分布式监控系统开发【day37】:监控客户端开发(五)
一.目录结构 二.模块方法调用关系总图 三.入口文件main 1.解决了说明问题 1.客户端就干了一件事情,干什么事情 收集数据汇报给服务端? 但是我这个客户端是插件形式2.首先必须要传一个参数,st ...
- day37协程与线程套接字通讯
协程与线程套接字通讯基于多线程实现套接字服务端支持并发,服务端 from socket import * from threading import Thread def comunicate(con ...
- day37 异步回调和协程
异步回调 """ 异步任务使用场景 爬虫 1.从目标站点下载网页数据 本质就是HTML格式字符串 2.用re从字符串中提取出你需要的数据 ""&quo ...
随机推荐
- Function,Object.creat();
一.Object.creat()使用方法 Object.creat(对象): 功能:实现继承,创建一个原型继承自参数的对象. 什么是原型式继承:就是利用修改原型链的结构(增加一个节点中的成员,删除一个 ...
- switch的用法
switch case 语句有如下规则: switch 语句中的变量类型可以是: byte.short.int 或者 char.从 Java SE 7 开始,switch 支持字符串 String 类 ...
- 基于 Web 的 Go 语言 IDE - Wide 1.5.2 发布!
这个版本由热心的开源贡献者加入了韩语支持,欢迎各位 gophers 加入到 Wide 的开源开发中.另外,这个版本还改进了 Playground,使其更稳定和易用.目前黑客派社区已经支持嵌入 Wide ...
- KCF的弊端
一.前情提要 如果你对目标跟踪和KCF是什么东西还不了解的话欢迎你看前一篇博文KCF入门详解:https://www.cnblogs.com/jins-note/p/10215511.html ...
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- Asp.Net Core Docker镜像更新系统从wheezy改为stretch
之前写过一个在Asp.Net Core里调用System.Drawing.Common绘图的DEMO,部署到Docker里运行,需要更新Asp.Net Core镜像的操作系统. https://www ...
- python基础一数据类型之字符串
摘要: python基础一中有字符串,所以这篇主要讲字符串. 一,字符串的注释 二,字符串的索引与切片 三,字符串的方法 一,字符串的注释 单引号 双引号 三引号都可以用户定义字符串.三引号不仅可以定 ...
- MySQL复制 slave_exec_mode 参数IDEMPOTENT 说明
背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式 ...
- Mysql binlog 无法删除(purge命令无法删除)
1.版本 1)操作系统 cat /etc/issueCentOS release 6.6 (Final)Kernel \r on an \m cat /proc/versionLinux versio ...
- fedora安装字体
#fedora安装新字体 将自己现有的字体复制到/usr/share/fonts/自己起个名字/ 例如我要安装下载的苹果苹方字体 #cp 我这个文件夹的地址/* /usr/share/fonts/Pi ...