一. 进程池与线程池

  在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途,例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对开启进程的数目加上了限制.

  

 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 线程池与进程池的更多相关文章

  1. 使用concurrent.futures模块中的线程池与进程池

    使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...

  2. Python并发复习4- concurrent.futures模块(线程池和进程池)

    Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...

  3. 协程与concurent.furtrue实现线程池与进程池

    1concurent.furtrue实现线程池与进程池 2协程 1concurent.furtrue实现线程池与进程池 实现进程池 #进程池 from concurrent.futures impor ...

  4. 内存池、进程池、线程池介绍及线程池C++实现

    本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...

  5. 并发编程:GIL,线程池,进程池,阻塞,非阻塞,同步,异步

    一  GIL(global interpreter lock) GIL中文叫全局解释器锁,我们执行一个文件会产生一个进程,那么我们知道进程不是真正的执行单位,而是资源单位,所以进程中放有解释器(cpy ...

  6. 多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures

    multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process( ...

  7. concurrent.futures模块简单介绍(线程池,进程池)

    一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...

  8. GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

    GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...

  9. Python线程池与进程池

    Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...

随机推荐

  1. 发现一种写法,类似callback&&callback()

    与callback&&callback()异曲同工 return data && { title: `To-do (${data.length})`, componen ...

  2. scp 实现文件打包上传到linux

    在A服务器上将/root/lk目录下所有的文件传输到B的/home/lk/cpfile目录下,命令为: scp -r /root/lk root@43.224.34.73:/home/lk/cpfil ...

  3. 用powershell实现自动化操作

    每天登录OA太繁琐,公司OA又只允许用IE,本身写chrome扩展水平也不高,更搞不懂selenium 既然是windows下工作,当然还得微软的东东.研究了几天,才发现用powershell就很方便 ...

  4. 关于xampp中无法启动mysql,Attempting to start MySQL service...的解决办法!!

    最近在学习服务器方面的知识,找到了这款功能强大的建站集成软件包——xampp.但是在开数据库服务器的时候,出现了这种情况.一直在Attemptng to start MySQL  service... ...

  5. pytorch学习-WHAT IS PYTORCH

    参考:https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor- ...

  6. leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String

    557. Reverse Words in a String III 最简单的把空白之间的词反转 class Solution { public: string reverseWords(string ...

  7. JavaScript模块化思想requireJS的使用

    1. 使用require.js的意义   (1)实现JS文件的异步加载,避免网页因为加载JS文件缓慢造成网页未响应 (2)管理模块之间的依赖性,便于代码的编写和维护.页面中只需要引入require.j ...

  8. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  9. SpringBoot开发案例之整合Dubbo分布式服务

    前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...

  10. Win10 Anaconda下TensorFlow-GPU环境搭建详细教程(包含CUDA+cuDNN安装过程)

    目录 前言 第一步:安装Anaconda 1.下载和安装 2.配置Anaconda环境变量 第二步:安装TensorFlow-GPU 1.创建conda环境 2.激活环境 3.安装tensorflow ...