封面图片来源:沙沙野

内容概览

  1. 进程池
  2. 进程池和多进程的性能测试
  3. 进程池的其他机制
  4. 进程池的回调函数

进程池

  1. 如果有多少个任务,就开启多少个进程,实际上并不划算。由于计算机的 cpu 个数是非常有限的因此开启的进程数量完全和 cpu 个数成比例
  2. 进程池的特点:同一时间最多有多少个进程能够同时执行任务与进程池中进程的个数有关系
  3. 如果进程池设置了个数,那么程序只会开启四个进程运行
from multiprocessing import Pool
import osdef func(i):print(i, os.getpid())if __name__ == "__main__":p = Pool(4)for i in range(10):# async 异步的提交任务p.apply_async(func, args=(i,))# 关闭池子,不是回收池子中的进程,而是阻止继续提交任务p.close()# 阻塞,直到池子中的任务都执行完毕p.join()# 运行结果:发现即使重新运行多次,最多也就出现四个进程
0 4866
1 4867
3 4866
2 4868
4 4867
5 4866
7 4866
8 4867
6 4869
9 4868# p.apply_async 要与 close/join 配合使用
# 保证主进程等待所有进程池中的任务执行完毕
# ret = p.apply_async(...)
# 在提交所有任务之后,从 ret 中获取结果(函数的返回值)
# 也能够让主进程等待池中任务完成

进程池和多进程的性能测试

  1. 起多进程的意义
  • 为了更好的利用 cpu,所以程序中都是网络 IO 或文件 IO 就不适合用多进程,就好比多人聊天,如果 1000 人同时聊天,服务器不可能开启 1000 个进程池,不然挂掉
  • 为了数据的隔离,如果程序中总是要数据共享,那么就不适合使用多进程
  • 超过了 cpu 个数的任务数,都应该使用进程池来解决问题,而不能无限开启子进程

2. 进程池和多进程的性能测试示例

import os
import time
from multiprocessing import Process, Pooldef func(i):print(i, os.getpid())if __name__ == "__main__":start = time.time()p_lst = []for i in range(5):p = Process(target=func, args=(i,))p.start()p_lst.append(p)for p in p_lst:p.join()end = time.time()pro_time = end - startstart = time.time()p = Pool(4)for i in range(5):p.apply_async(func, args=(i,))p.close()p.join()end = time.time()pool_time = end - startprint("多进程所需时间:%s" % pro_time)print("进程池所需时间:%s" % pool_time)# 运行结果:
0 16738
1 16739
2 16740
3 16741
4 16742
0 16743
1 16744
2 16745
4 16743
3 16746
多进程所需时间:0.006443500518798828
进程池所需时间:0.11818265914916992

进程池的其他机制

  1. map() 的用法
import os
import time
from multiprocessing import Pooldef func(i):time.sleep(0.1)print(i,os.getpid())if __name__ == '__main__':p = Pool(4)p.map(func,range(5))# 运行结果:
0 17333
2 17335
1 17334
3 17336
4 17333# 这里 p.map(func,range(5)) 相当于:
for i in range(5):p.apply_async(func, args=(i,))
p.close()
p.join()

2. 进程池里面可以使用 get() 得到 func() 的返回值

import os
import time
from multiprocessing import Pooldef func(i):time.sleep(1)print(i,os.getpid())return i**iif __name__ == '__main__':p = Pool(4)ret_lst = []for i in range(10):ret = p.apply_async(func,args=(i,))ret_lst.append(ret)p.close()p.join()for ret in ret_lst:print(ret.get())# 运行结果:
0 17517
2 17519
1 17518
3 17520
4 17517
6 17518
5 17519
7 17520
9 17517
8 17518
1
1
4
27
256
3125
46656
823543
16777216
387420489

进程池的回调函数

  1. 大概思路
  • 将 n 个任务交给 n 个进程去执行
  • 每一个进程在执行完毕之后会有一个返回值,这个返回值会直接交给 callback 参数指定的那个函数去进行处理
  • 这样的话,所有的进程 哪一个执行的最快,哪一个就可以先进性统计工作,能在最短的时间内得到结果

2. 回调函数用来保证一个任务在执行完毕之后,立刻发出 callback 回调函数中的内容 并且子进程的函数返回值作为 callback 函数的参数

import time
import random
from multiprocessing import Process,Pool# 进程池的子进程执行这个函数的
def get(i):time.sleep(random.random())print('从网页获取一个网页的内容', i)return i,'网页的内容'*i# 主进程执行这个函数
def call_back(content):print(content)if __name__ == '__main__':p = Pool(5)ret_l = []for i in range(10):p.apply_async(get,args=(i,),callback=call_back)p.close()p.join()# 运行结果:
从网页获取一个网页的内容 4
(4, '网页的内容网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 0
(0, '')
从网页获取一个网页的内容 3
(3, '网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 6
(6, '网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 1
(1, '网页的内容')
从网页获取一个网页的内容 8
(8, '网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 5
(5, '网页的内容网页的内容网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 2
(2, '网页的内容网页的内容')
从网页获取一个网页的内容 9
(9, '网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容')
从网页获取一个网页的内容 7
(7, '网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容网页的内容')

linux多进程server 进程池_Python 中的进程池与多进程相关推荐

  1. python进程池和线程池_Python中的进程池与线程池(包含代码)

    引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用submit异步调用 异步+回调函数 ...

  2. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  3. python协程怎么做数据同步_Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

  4. pythonmultiprocessing之 queue线程_python中的进程、线程(threading、multiprocessing、Queue、subprocess)...

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  5. python 进程池_Python实践17-进程池

    多进程的优势尽管Python中的线程是OS原生的(它们不是被模拟出来的,它们是真实的操作系统线程),它们被全局解释器锁(GIL)所束缚,所以同一时刻只有一个线程可以和Python对象交互. 通过使用多 ...

  6. python中exec是什么意思_Python中的进程分支fork和exec详解

    在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独 ...

  7. python连接池框架_Python中的连接池是非常重要的!神级程序员详解!

    概述 连接池的作用就是为了提高性能,将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对Server端进行访问.这样 省略了创建连接和销毁连接的过程(TCP连接建立时的三次握手和销毁 ...

  8. vc sleep不占进程_Python 中的进程深入

    封面图片来源:沙沙野 内容概览 进程的 join 方法 数据隔离 进程对象的其他方法 守护进程 抢票程序示例 队列 进程之间的通信 (IPC) 进程的 join 方法 假设要群发 1000 封邮件,发 ...

  9. linux mysql 僵尸进程_Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 僵尸 ...

最新文章

  1. 【干货小铺】各种编程语言的深度学习库整理
  2. 部署Small Business Server 2003服务器之四
  3. stm32 GPIO简单介绍及初始化配置(库函数)
  4. OpenGL编程指南1:OpenGL简介
  5. 项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发
  6. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
  7. excel教程自学网_超实用!良心推荐15个神级自学网站,内容全面质量又高
  8. 工业锅炉计算机控制系统框图,计算机控制系统实例..doc
  9. 如何在Windows系统上实现共享文件夹
  10. Django分布式路由
  11. NBA各队所在分区,州,城市,主体育馆资料整理
  12. 机器人开发--设计范式
  13. Blender_7_倒角
  14. 必备的 Linux 技能,请收好!
  15. RabbitMq 虚拟主机 virtual-host ,Springboot 中使用 RabbitMq 虚拟主机 virtual-host
  16. 项目1----泰戈尔诗集
  17. Docker: 现在和未来
  18. 【修改蓝牙设备名称】一步简单操作
  19. 基于Linux的航班管理系统
  20. 【Android开发】Android入门安装与使用教程——以Android Studio3.6.1为例

热门文章

  1. dataTable() 与 DataTable() 的差别与处理方式
  2. 深信服上网行为-域新组建模式单点登录不成功排错
  3. 数据结构-算法: 分配排序(基数分配排序法)
  4. ASP.NET中常用的26个优化性能方法(转)
  5. PHP学习:PHP超全局变量(Superglobal)$GLOBALS的介绍以及和global的区别
  6. 线性表----单链表
  7. 多进程对 MySQL update的影响
  8. solr索引服务器的配置和solrj集成开发总结
  9. 基于catalog 创建RMAN存储脚本
  10. PHP解析JSON数据的源代码