一. 进程池与线程池

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

  

  1. from socket import *
  2. from threading import Thread
  3.  
  4. def connect(conn):
  5. while True:
  6. try:
  7. data=conn.recv(8192)
  8. print(data.decode("utf-8").upper())
  9. if not data:
  10. break
  11. conn.send(data.upper())
  12. except ConnectionResetError:
  13. break
  14. conn.close()
  15.  
  16. def server(ip,port):
  17. ser=socket(AF_INET,SOCK_STREAM)
  18. ser.bind((ip,port))
  19. ser.listen(5)
  20. print("server is running")
  21. while True:
  22. conn,addr=ser.accept()
  23. t=Thread(target=connect,args=(conn,))
  24. t.start()
  25.  
  26. ser.close()
  27.  
  28. if __name__=='__main__':
  29. server("127.0.0.1",19980)

基于多线程的套接字通信服务端

  1. from socket import *
  2.  
  3. client = socket(AF_INET,SOCK_STREAM)
  4. client.connect(("127.0.0.1",19980))
  5.  
  6. while True:
  7. inp = input(">>>>").strip()
  8. if not inp:
  9. continue
  10. client.send(inp.encode("utf-8"))
  11. data = client.recv(8192)
  12. print(data.decode("utf-8"))
  13. client.close()

基于多线程套接字通信客户端

  在上面的套接字通信中,客户端来一个请求,服务器就开一个线程.如果来了1000个请求,服务器就开1000线程.这样就对服务器端造成很大的负担,很可能就造成宕机.这时候,我们就可以用到线程池了.

  1. from socket import *
  2. from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
  3.  
  4. def connect(conn):
  5. while True:
  6. try:
  7. data=conn.recv(8192)
  8. print(data.decode("utf-8").upper())
  9. if not data:
  10. break
  11. conn.send(data.upper())
  12. except ConnectionResetError:
  13. break
  14. conn.close()
  15.  
  16. def server(ip,port):
  17. ser=socket(AF_INET,SOCK_STREAM)
  18. ser.bind((ip,port))
  19. ser.listen(5)
  20. print("server is running")
  21. while True:
  22. conn,addr=ser.accept()
  23. pool.submit(connect,conn)
  24.  
  25. ser.close()
  26.  
  27. if __name__=='__main__':
  28. pool = ThreadPoolExecutor(max_workers=3)
  29. server("127.0.0.1",19980)

基于线程池_服务端

  1. from socket import *
  2.  
  3. client = socket(AF_INET,SOCK_STREAM)
  4. client.connect(("127.0.0.1",19980))
  5.  
  6. while True:
  7. inp = input(">>>>").strip()
  8. if not inp:
  9. continue
  10. client.send(inp.encode("utf-8"))
  11. data = client.recv(8192)
  12. print(data.decode("utf-8"))
  13. 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. 安装站点时出现“连接数据库出现数据库server或登录password无效,无法连接数据库,请又一次设定”解决方法

    在安装站点时出现  "连接数据库出现数据库server或登录password无效,无法连接数据库,请又一次设定"  可是数据库username和password是正确的,在serv ...

  2. java读取properties中文乱码

    1 确认properties文件的编码是utf-8 2 采用流的方式读取文件,设置编码为utf-8 public class ErrorCodeConfig { static Properties p ...

  3. js如何判断对象是否为空

    1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) == "{ ...

  4. Python:Day26 socket

    SOCKET通信流程 服务器创建套接字链接: 1.创建SOCKET,socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=No ...

  5. 给大家推荐一个C#下的Ribbon风格的Forms实现示例-含源码

    C#下的Ribbon风格的Forms实现示例:源码下载地址

  6. maven的下载,环境变量配置,和eclipse配置,和IntelliJIDEA配置

    一.maven简介 Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖 ...

  7. git中Please enter a commit message to explain why this merge is necessary.

    Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...

  8. WPF效果(GIS三维篇)

    二维的GIS已经被我玩烂了,紧接着就是三维了,哈哈!先来看看最简单的效果:

  9. 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示

    在一些数据的即时查询场景中,我们可能需要对输入信息进行模糊查询并进行选择,例如在一些文本输入场景,如输入某个站点编码或者设备编码,然后获取符合的列表供用户选择的场景,本篇随笔介绍在DevExpress ...

  10. Nginx学习之如何搭建文件防盗链服务

    前言 大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢? 这里推荐一款比较容易上手的神器,Nginx本身提供了secure_ ...