可以重复利用的线程

直接上代码

from threading import Thread, current_thread
from queue import Queue
# 重写线程类
class MyThread(Thread):def __init__(self):super().__init__()self.daemon = True  # 守护线程self.queue = Queue(10)self.start()  # 实例化的时候开启线程def run(self):  # 子线程只有这一个线程, 从队列里面拿任务while True:task, args, kwargs = self.queue.get()  # 拿任务 也是元组task(*args, **kwargs)  # 可能有,可能没有,所有传入不定长参数self.queue.task_done()   # 结束任务def apply_async(self, func, args=(), kwargs={}):   # 自写任务,不是重写任务, 充当生产者, 给线程提供任务(把任务扔到队列)
        self.queue.put((func, args, kwargs))def join_R(self):   # 主线程等待子线程结束self.queue.join()   # task_done 为0 的时候就阻塞def func():print(1, current_thread())def func2(*args, **kwargs):print(2, current_thread())print('func: ', args, kwargs)t = MyThread()
t.apply_async(func)
t.apply_async(func2, args=(1,2), kwargs={'a':1, 'b':2})
print("任务提交完成")
t.join_R()
print("任务完成")

结果:

任务提交完成
1 <MyThread(Thread-1, started daemon -1223214272)>
2 <MyThread(Thread-1, started daemon -1223214272)>
func:  (1, 2) {'a': 1, 'b': 2}
任务完成    任务完成后,主线程就开始退出, 因此守护线程被杀死

线程池的简单实现

池的概念

主线程: 相当于生产者,只管向线程池提交任务。
               并不关心线程池是如何执行任务的。
               因此,并不关心是哪一个线程执行的这个任务。
线程池: 相当于消费者,负责接收任务,
               并将任务分配到一个空闲的线程中去执行。

代码实现如下:

from threading import Thread, current_thread
from queue import Queueclass T_pool:def __init__(self, n):  # 准备多少个池super().__init__()self.queue = Queue()for i in range(n):  # 在池里开多少个线程Thread(target=self.fun, daemon=Thread).start()    # 守护进程 并启动def fun(self):   # 生产者while True:task = self.queue.get()task()self.queue.task_done()def apply_async(self, task):   # 消费者
        self.queue.put(task)def join(self):self.queue.join()def func():print(current_thread())def func2():print(current_thread())p = T_pool(2)
p.apply_async(func)
p.apply_async(func2)
p.join()

结果:

<Thread(Thread-1, started daemon -1223324864)>
<Thread(Thread-1, started daemon -1223324864)>

Python自带的池

内置线程池

from multiprocessing.pool import ThreadPool     # 线程池
from multiprocessing import pool  # 进程池
# 内置线程池
def fun(*args, **kwargs):print(args, kwargs)p = ThreadPool(2)   # 直接使用内置的
p.apply_async(fun, args=(1,2), kwds={'a':1})
p.close()   # 要求:在join前必须要close,这样就不允许再提交任务了
p.join()

结果:

(1, 2) {'a': 1}

内置进程池

from multiprocessing import Pool  # 进程池
# 内置进程池
def fun(*args, **kwargs):print(args, kwargs)if __name__ == '__main__': # 必须要有一个main测试p = Pool(2)   # pool的实例化必须在main测试之下p.apply_async(fun, args=(1,2), kwds={'a':1})p.close()   # 要求:在join前必须要close,这样就不允许再提交任务了p.join()

结果:

(1, 2) {'a': 1}

池的其他操作
操作一: close - 关闭提交通道,不允许再提交任务
操作二: terminate - 中止进程池,中止所有任务
操作三: 结果操作

结果操作

from multiprocessing.pool import ThreadPool
import time
def func(n):if n == 1:return 1elif n == 2:return 2return func(n-1) + func(n-2)pool = ThreadPool()a_result = pool.apply_async(func, args=(35,))
print("note1:",time.asctime(time.localtime(time.time())))
result = a_result.get() # 会阻塞,知道结果产生了
print("note2:",time.asctime(time.localtime(time.time())))

结果:

note1: Mon Sep 17 00:07:31 2018
note2: Mon Sep 17 00:07:34 2018

使用池来实现并发服务器

使用线程池来实现并发服务器

import socket
from multiprocessing.pool import ThreadPool  # 线程池
from multiprocessing import Pool, cpu_count
'''
使用线程池来实现
并发服务器
'''
print(cpu_count())server = socket.socket()
server.bind(('0.0.0.0', 8080))
server.listen(1000)def work_thread(conn):while True:data = conn.recv(1000)if data:print(data)conn.send(data)else:conn.close()breakif __name__ == '__main__':t_pool = ThreadPool(5)  # 使用线程池, 通常分配2倍的cpu个数while True:conn,addr = server.accept()t_pool.apply_async(work_thread, args=(conn,))  # 接收的是个任务, conn做为参数

使用进程池来实现并发服务器

import socket
from multiprocessing.pool import ThreadPool  # 线程池
from multiprocessing import Pool, cpu_count
'''
使用进程池来实现
并发服务器
'''
print(cpu_count())server = socket.socket()
server.bind(('0.0.0.0', 9000))
server.listen(1000)def work_process(server):t_pool = ThreadPool(cpu_count()*2)  # 使用线程池, 通常分配2倍的cpu个数while True:conn,addr = server.accept()t_pool.apply_async(work_thread, args=(conn,))  # 接收的是个任务, conn做为参数def work_thread(conn):while True:data = conn.recv(1000)if data:print(data)conn.send(data)else:conn.close()breakn = cpu_count()  # 获取当前计算机的CPU核心数量
p = Pool(n)
for i in range(n):  # 充分利用CPU, 为每个CPU分配一个进程p.apply_async(work_process, args=(server,))p.close()
p.join()

客户端:

import socketclick = socket.socket()
click.connect(('127.0.0.1', 8888))while True:data = input("请输入你要发送的数据:")click.send(data.encode())print("接收到的消息: {}".format(click.recv(1024).decode()))

总结完毕。

作者:含笑半步颠√

博客链接:https://www.cnblogs.com/lixy-88428977

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

转载于:https://www.cnblogs.com/lixy-88428977/p/9658417.html

python_进程池以及线程池相关推荐

  1. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  2. python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...

    前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...

  3. Python3高并发定时更新任务进程池和线程池的使用

    Python3高并发定时更新任务进程池和线程池的使用 背景:需要定时对数据库的某一张表做更新 不管用多线程还是多进程只能利用当前一台机器的计算能力,可以考虑使用celery这样的工具,后期可以横向扩展 ...

  4. 进程池、线程池、回调函数、协程

    阅读目录 摘要: 进程池与线程池 同步调用和异步调用 回调函数 协程 一.进程池与线程池: 1.池的概念: 不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源. 也就是说,硬件的承载能力是有 ...

  5. 并发编程——进程池与线程池

    一.简单介绍 在学习了多进程或多线程之后,我们可能会迫不及待地基于多进程或多线程做一些开发,然而毫无节制的开启进程或线程是十分危险的. 服务开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...

  6. python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...

    1. 2. 为啥要有 进程池和线程池 进程池来控制进程数目,比如httpd的进程模式,规定最小进程数和最大进程数 3.创建进程池的类pool 如果指定numprocess为3,则进程池会从无到有创建三 ...

  7. Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)

    一.问题引入 在前面编写多进程.多线程服务器时通过动态创建子进程和子线程来实现并发服务器,这样做有以下缺点: 1)动态创建进程.线程将会比较耗费时间,将导致较慢的客户响应. 2)动态创建的子进程只为一 ...

  8. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

  9. python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  10. python 进程池阻塞和非阻塞_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO ...

最新文章

  1. Android——学习:线性布局权重分配
  2. 比特币现金(BCH)将在2018年占据主导地位
  3. 华为备忘录导入印记云笔记_原来华为手机自带会议神器,开会不用手写,这个功能就能搞定...
  4. 各种ARM仿真器接口图
  5. git add后取消_git 必看,各种撤销操作
  6. Pytorch中的 torch.Tensor() 和 torch.tensor() 的区别
  7. Windows 版Oracle 19c 下载安装步骤及细节(Oracle数据库下载)
  8. BiNGO的GO分析
  9. mov格式的视频转换mp4?视频格式转换这样做
  10. CLM陆面过程模式实践技术应用
  11. Windows系统的基础上装Ubuntu双系统系统分区问题
  12. 权利要求的撰写 分享
  13. 【冒泡排序Java版】
  14. mysql查询所有姓王的信息_MySQL(4)— 数据查询
  15. 京津冀计算机学科大学排名,2021京津冀地区民办大学排名前十
  16. My SQL work bench的常见问题之——Could not acquire management access for administration
  17. 低调、爱独处、不爱说话的你有职场自闭症吗?
  18. OpenDDS开发人员指南中文版3.23(14)DDS Security安全性
  19. 基因数据处理51之cs-bwamem集群版运行*
  20. opencv中cvtcolor()函数用法总结(07)

热门文章

  1. 【笔记】正则入门学习
  2. 【视频回放】一建(通信与广电专业)备考指南​
  3. Advancing Transformer Transducer for Speech Recognition on Large-Scale Dataset》
  4. 技校毕业是什么学历_技校毕业是什么学历 技校属于什么文凭
  5. 思岚科技Rplidar A3实现指定角度扫描及扫描结果存储输出
  6. GridLayout平均分配空间
  7. 双十一无线蓝牙耳机哪款好?2021最好用的降噪蓝牙耳机推荐
  8. android判断键盘是否弹出窗口,Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)...
  9. mysql堡垒机漏洞_堡垒机实例以及数据库操作
  10. 师生相逢,潇潇洒洒出品