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线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
随机推荐
- 前端使用node.js+express+mockjs+mysql实现简单服务端,2种方式模拟数据返回
今天,我教大家来搭建一个简单服务端 参考文章: https://www.jianshu.com/p/cb89d9ac635e https://www.cnblogs.com/jj-notes/p/66 ...
- php面试题整理(一)
str_split() print_r(str_split("Shanghai"));Array ( [0] => S [1] => h [2] => a [3] ...
- Linux系统安装和网络配置
系统下载 CentOS 6.x 50% 6.9 ---- 常用 CentOS 7.x 50% 7.2 ----常用 官网-国外 https://wiki.centos.org/Downloa ...
- 思考与算法:大脑是cpu、思考是算法
思考与算法:大脑是cpu.思考是算法
- JavaScript对象数组根据某属性sort升降序排序
1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16 ...
- shallow clone
shallow clone 浅克隆经常在一些大型仓库中很有用——不用花费大量时间去clone一个完整的仓库,仅仅checkout出来某个分支(如master)的最新N次递交: git clone -- ...
- No.3
1.查看httpd进程数(即prefork模式下Apache能够处理的并发请求数): ps -ef | grep httpd | wc -l 返回结果示例: 1388 表示Apache能够处理1388 ...
- ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。
网页 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf ...
- 在JS中调用CS里的方法(PageMethods)
在JS中调用CS里的方法(PageMethods) 2014年04月28日 11:18:18 被动 阅读数:2998 最近一直在看别人写好的一个项目的源代码,感觉好多东西都是之前没有接触过的.今天 ...
- JDK动态代理(2)--------反射Method的作用
Person类做例子 package com.spring.aop.proxy; public class Preson { Preson() { System.out.println("t ...