day 7-7 线程池与进程池
一. 进程池与线程池
在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途,例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对开启进程的数目加上了限制.
from socket import *
from threading import Thread def connect(conn):
while True:
try:
data=conn.recv(8192)
print(data.decode("utf-8").upper())
if not data:
break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close() def server(ip,port):
ser=socket(AF_INET,SOCK_STREAM)
ser.bind((ip,port))
ser.listen(5)
print("server is running")
while True:
conn,addr=ser.accept()
t=Thread(target=connect,args=(conn,))
t.start() ser.close() if __name__=='__main__':
server("127.0.0.1",19980)
基于多线程的套接字通信服务端
from socket import * client = socket(AF_INET,SOCK_STREAM)
client.connect(("127.0.0.1",19980)) while True:
inp = input(">>>>").strip()
if not inp:
continue
client.send(inp.encode("utf-8"))
data = client.recv(8192)
print(data.decode("utf-8"))
client.close()
基于多线程套接字通信客户端
在上面的套接字通信中,客户端来一个请求,服务器就开一个线程.如果来了1000个请求,服务器就开1000线程.这样就对服务器端造成很大的负担,很可能就造成宕机.这时候,我们就可以用到线程池了.
from socket import *
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def connect(conn):
while True:
try:
data=conn.recv(8192)
print(data.decode("utf-8").upper())
if not data:
break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close() def server(ip,port):
ser=socket(AF_INET,SOCK_STREAM)
ser.bind((ip,port))
ser.listen(5)
print("server is running")
while True:
conn,addr=ser.accept()
pool.submit(connect,conn) ser.close() if __name__=='__main__':
pool = ThreadPoolExecutor(max_workers=3)
server("127.0.0.1",19980)
基于线程池_服务端
from socket import * client = socket(AF_INET,SOCK_STREAM)
client.connect(("127.0.0.1",19980)) while True:
inp = input(">>>>").strip()
if not inp:
continue
client.send(inp.encode("utf-8"))
data = client.recv(8192)
print(data.decode("utf-8"))
client.close()
基于线程池_客户端
二. 线程池和进程池的基本方法
1.submit(fn, *args, **kwargs):异步提交任务
2.map(func, *iterables, timeout=None, chunksize=1) :取代for循环的submi
3.shutdown(wait=):
相当于进程池的pool.close()+pool.join()操作
wait=True,等待池内所有任务执行完毕回收完资源后才继续
wait=False,立即返回,并不会等待池内的任务执行完毕
但不管wait参数为何值,整个程序都会等到所有任务执行完毕
submit和map必须在shutdown之前
4.result(timeout=None):取得结果
5.add_done_callback(fn):回调函数
day 7-7 线程池与进程池的更多相关文章
- 使用concurrent.futures模块中的线程池与进程池
使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...
- Python并发复习4- concurrent.futures模块(线程池和进程池)
Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...
- 协程与concurent.furtrue实现线程池与进程池
1concurent.furtrue实现线程池与进程池 2协程 1concurent.furtrue实现线程池与进程池 实现进程池 #进程池 from concurrent.futures impor ...
- 内存池、进程池、线程池介绍及线程池C++实现
本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...
- 并发编程:GIL,线程池,进程池,阻塞,非阻塞,同步,异步
一 GIL(global interpreter lock) GIL中文叫全局解释器锁,我们执行一个文件会产生一个进程,那么我们知道进程不是真正的执行单位,而是资源单位,所以进程中放有解释器(cpy ...
- 多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures
multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process( ...
- concurrent.futures模块简单介绍(线程池,进程池)
一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...
- GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
随机推荐
- Linux crm 运行
crm 项目部署 运行 crm 准备代码 django_crm.zip 上传windows中的代码到linux中,可选 lrzsz(只能传单个的文件)或者xftp 使用lrzsz传输,必须压缩代码包 ...
- 设计模式のFactoryPattern(工厂模式)----创建模式
一.产生背景 设计一个连接服务器的框架,需要三个协议,"POP3"."IMAP"."HTTP",可以把这三个作为产品类,共同实现一个接口. ...
- windows 增加右键功能 -->用命令行打开
windows 增加右键功能 -->用命令行打开 实现 注册表 以管理员权限CMD 到指定文件夹 Windows Registry Editor Version 5.00 [HKEY_CLASS ...
- @ModelAttribute
在执行Controller方法前都会新建一个Map对象称为隐含模型,该Map对象是共享的,如果一个方法的入参为Map ModelAndMap ModelMap等类型,那么会把隐含模型当做入参赋给方法. ...
- linux stat 查看文件的详细信息
linux stat查看文件详细信息 [root@oldboy01 tmp]# stat /tmp/1.cc File: `/tmp/1.cc' Size: 4 Blocks: 8 IO Block: ...
- Django适合做大用户量的系统吗?
分几点来答: 1. 首先,这其实是个技术选型题. 做技术选型的时候不能单纯的考虑性能,应该优先考虑业务类型,以及团队水平.另外的话,框架只是其中一环,还有配套呢. 如果是数据驱动型,尤其是要用到关系型 ...
- UIWindow 官方文档解析
UIWindow定义了一个window对象,其用于管理和协调一个app在设备屏幕上的显示.除非一个app能在外部设备上显示内容,一般就只有一个window. window的主要功能:1)提供一个区域来 ...
- 个人博客添加网易云音乐Flash插件
博客底部添加网易云音乐播放插件 歌单或者歌曲外链可从音乐界面"生成外链播放器"中得到,选择Flash播放插件即可 footer.html文件增加 实现效果: 历史精选文章: Jli ...
- Java性能优化之编程技巧总结
程序的性能受代码质量的直接影响.在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能. 1.慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获, ...
- SpringBoot分布式 - SpringCloud
一:介绍 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...