今日内容

  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的更多相关文章

  1. day37 爬虫2(web微信、高性能相关、Scrapy)

    s16day37 爬虫2 参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html 课堂代码:https://github.com/liyon ...

  2. day37——阻塞、非阻塞、同步、异步

    day37 阻塞.非阻塞.同步.异步 进程运行的三个状态:运行.就绪.阻塞 执行的角度 阻塞:程序运行时,遇到了IO,程序挂起,CPU被切走 非阻塞:程序没有遇到IO,程序遇到IO但是我通过某种手段, ...

  3. 如风一样,飞翔------Day37

    我一直都觉得自己是个反应没有那么敏锐的人,而不幸的是其实也是,所以,在菜鸟的头衔上,我不得不再背负上一个笨鸟的"光芒".我不苛求一飞冲天的传奇,却也有着不甘寂寞的激昂,我选择先飞, ...

  4. 分布式监控系统开发【day37】:需求讨论(一)

    本节内容 为什么要做监控? 常用监控系统设计讨论 监控需求讨论 如何实现监控服务器的水平扩展? 监控系统架构设计 一.为什么要做监控? 熟悉IT监控系统的设计原理 开发一个简版的类Zabbix监控系统 ...

  5. 分布式监控系统开发【day37】:表结构设计(二)

    一.表结构关系图 二.表结构需求讨论 1.主机表(Host) 1.解决了什么问题? 1.如果我不想让它监控了,就有一个开关的东西给它禁掉2.主机存活状态检测间隔 2.代码 class Host(mod ...

  6. 分布式监控系统开发【day37】:填充表配置项目(三)

    一.注册站点初始化数据库 1.目录结构 2.初始化数据库 python3 manage.py makemigrations python3 manage.py migrate #django2.0之前 ...

  7. 分布式监控系统开发【day37】:服务端生成配置数据(四)

    一.目录结构 二.引子与代码 1.客户端获取服务列表接口 1.解决了什么问题 客户端要给我获取服务列表的的时候,他肯定要告诉他是谁?他怎么告诉我,客户端必须有一个id号 Saltsack你装一个客户端 ...

  8. 分布式监控系统开发【day37】:监控客户端开发(五)

    一.目录结构 二.模块方法调用关系总图 三.入口文件main 1.解决了说明问题 1.客户端就干了一件事情,干什么事情 收集数据汇报给服务端? 但是我这个客户端是插件形式2.首先必须要传一个参数,st ...

  9. day37协程与线程套接字通讯

    协程与线程套接字通讯基于多线程实现套接字服务端支持并发,服务端 from socket import * from threading import Thread def comunicate(con ...

  10. day37 异步回调和协程

    异步回调 """ 异步任务使用场景 爬虫 1.从目标站点下载网页数据 本质就是HTML格式字符串 2.用re从字符串中提取出你需要的数据 ""&quo ...

随机推荐

  1. [原创.数据可视化系列之八]使用等d3进行灰度图转伪彩色

    对灰度图进行彩色化是数据可视化中常见的需求,使用d3在客户端比较容易实现,本文使用d3生成图片,并显示: 代码如下: 代码中首先下载数据文件,然后设定d3的色带信息,生成一个空白的canvas元素,并 ...

  2. JSP内置对象——page对象

    观察可发现,这里面的方法,就是Object这个类下的一些方法,下面进行一个简单的演示,比如“toString()”方法: 运行结果: 这时候看到了一个“org.apache.jsp.page_jsp@ ...

  3. Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建

    前言: 最近在考虑搭建个人网站,想了想决定采用前后端分离模式 前端使用Vue,负责接收数据 后端使用Spring Boot,负责提供前端需要的API 就这样开启了我边学习边实践之旅 Vue环境搭建步骤 ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  5. win10 安装microsoft.net framework3.5

    转载于:https://www.windows10.pro/win10-net-framework-3-5/ 之前手残不小心把microsoft.net framework3.5删了,结果导致Sql ...

  6. QtDesigner与程序设计模式

    在我的上一篇博文中提到我认识到UI设计的重要性.在这里将解析一下使用QtDesigner设计UI进行程序GUI的设计,QtDesigner的.ui文件可以转化为许多的程序代码,比如我知道的就有:c++ ...

  7. [原创]使MySQL注释语句在后台能够输出的方法

    开启general log或slow log的时候,前端发出的sql语句中的注释都别屏蔽掉了. 本意加注释我们想通过注释来快速知道sql是由哪个业务模块发出的.这点对dba和研发很有帮助. 一种变通的 ...

  8. [Spark SQL_3] Spark SQL 高级操作

    0. 说明 DataSet 介绍 && Spark SQL 访问 JSON 文件 && Spark SQL 访问 Parquet 文件 && Spark ...

  9. 团队作业——Alpha冲刺 5/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面完成部分内容,学习了下拉菜单控件的建立,完善界面标题内容,以及交互. 明日任务:继续完善编辑界面,学习使用gallery,着手配图 ...

  10. 【Ansible 文档】【译文】Windows 支持

    see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...