引入进程池与线程池

使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor

使用shutdown

使用submit同步调用

使用submit异步调用

异步+回调函数

并发实现套接字通信

引入进程池

在学习线程池之前,我们先看一个例子

1 #from multiprocessing import Process

2 #import time

3 #

4 #def task(name):

5 #print('name',name)

6 #time.sleep(1)

7 #if __name__ == '__main__':

8 #start=time.time()

9 #p1 = Process(target=task,args=("safly1",))

10 #p2 = Process(target=task, args=("safly2",))

11 #p3 = Process(target=task, args=("safly3",))

12 #

13 #p1.start()

14 #p2.start()

15 #p3.start()

16 #

17 #p1.join()

18 #p2.join()

19 #p3.join()

20 #

21 #print("main")

22 #

23 #end = time.time()

24 #print(end- start)

输出如下:

以上的方式是一个个创建进程,这样的耗费时间才1秒多,虽然高效,但是有什么弊端呢?

如果并发很大的话,会给服务器带来很大的压力,所以引入了进程池的概念

使用ProcessPoolExecutor进程池

什么时候用池:

池的功能是限制启动的进程数或线程数,

什么时候应该限制???

当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时

就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内

Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持。

通过ProcessPoolExecutor 来做示例。

我们来看一个最简单的进程池

1 from concurrent.futures importProcessPoolExecutor

2 importtime

3 deftask(name):

4 print('name',name)

5 time.sleep(1)

6 if __name__ == '__main__':

7 start=time.time()

8 p1=ProcessPoolExecutor(2)

9 for i in range(5):

10 p1.submit(task,i)

11 p1.shutdown(wait=True)

12 print('主')

13 end=time.time()

14 print(end-start)

输出如下:

1 D:\APPS\Python3.7\python.exe "D:/Python/project one/day20180717/进程池与线程池.py"

2 name 0

3 name 1

4 name 2

5 name 3

6 name 4

7 主

8 3.118098258972168

9

10 Process finished with exit code 0

简单解释下:

ProcessPoolExecutor(2)创建一个进程池,容量为2,循环submit出5个进程,然后就在线程池队列里面,执行多个进程,p1.shutdown(wait=True)意思是进程都执行完毕,在执行主进程的内容

使用shutdown

p1.shutdown(wait=True)是进程池内部的进程都执行完毕,才会关闭,然后执行后续代码

如果改成false呢?看如下代码

1 from concurrent.futures importProcessPoolExecutor

2 importtime

3 deftask(name):

4 print('name',name)

5 time.sleep(1)

6 if __name__ == '__main__':

7 start=time.time()

8 p1=ProcessPoolExecutor(2)

9 for i in range(5):

10 p1.submit(task,i)

11 p1.shutdown(wait=False)

12 print('主')

13 end=time.time()

14 print(end-start)

输出如下:

1 D:\APPS\Python3.7\python.exe "D:/Python/project one/day20180717/进程池与线程池.py"

2 主

3 0.008975744247436523

4 name 0

5 name 1

6 name 2

7 name 3

8 name 4

9

10 Process finished with exit code 0

使用submit同步调用

同步:提交完任务后就在原地等待,直到任务运行完毕并且拿到返回值后,才运行下一行代码

from concurrent.futures importProcessPoolExecutor

importtime, random, os

defpiao(name, n):

print('%s is piaoing %s' %(name, os.getpid()))

time.sleep(1)

return n ** 2

if __name__ == '__main__':

p = ProcessPoolExecutor(2)

start =time.time()

for i in range(5):

res=p.submit(piao,'safly %s' %i,i).result() #同步调用

print(res)

p.shutdown(wait=True)

print('主', os.getpid())

stop =time.time()

print(stop - start)

1 D:\APPS\Python3.7\python.exe "D:/Python/project one/day20180717/进程池与线程池.py"

2 safly 0 is piaoing 11448

3 0

4 safly 1 is piaoing 11800

5 1

6 safly 2 is piaoing 11448

7 4

8 safly 3 is piaoing 11800

9 9

10 safly 4 is piaoing 11448

11 16

12 主 8516

13 5.095325946807861

14

15 Process finished with exit code 0

使用submit异步调用

异步:提交完任务(绑定一个回调函数)后不原地等待,直接运行下一行代码,等到任务运行有返回值自动触发回调的函数的运行

1 from concurrent.futures importThreadPoolExecutor

2 importtime

3 deftask(name):

4 print('name',name)

5 time.sleep(1)

6 if __name__ == '__main__':

7 start=time.time()

8 p1=ThreadPoolExecutor(2)

9 for i in range(5):

10 p1.submit(task,i)

11 p1.shutdown(wait=True)

12 print('主')

13 end=time.time()

14 print(end-start)

1 D:\APPS\Python3.7\python.exe "D:/Python/project one/day20180717/进程池与线程池.py"

2 name 0

3 name 1

4 name 2

5 name 3

6 name 4

7 主

8 3.003053903579712

使用回调函数+异步

进程

#from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor#import os#import time#import random#

#def task(n):#print('%s run...' %os.getpid())#time.sleep(5)#return n**2#

#def parse(future):#time.sleep(1)#res=future.result()#print('%s 处理了 %s' %(os.getpid(),res))#

#if __name__ == '__main__':#pool=ProcessPoolExecutor(4)## pool.submit(task,1)## pool.submit(task,2)## pool.submit(task,3)## pool.submit(task,4)#

#start=time.time()#for i in range(1,5):#future=pool.submit(task,i)#future.add_done_callback(parse) # parse会在futrue有返回值时立刻触发,并且将future当作参数传给parse#pool.shutdown(wait=True)#stop=time.time()#print('主',os.getpid(),(stop - start))

1 from concurrent.futures importProcessPoolExecutor,ThreadPoolExecutor

2 from threading importcurrent_thread

3 importos

4 importtime

5 importrandom

6

7 deftask(n):

8 print('%s run...' %current_thread().name)

9 time.sleep(5)

10 return n**2

11

12 defparse(future):

13 time.sleep(1)

14 res=future.result()

15 print('%s 处理了 %s' %(current_thread().name,res))

16

17 if __name__ == '__main__':

18 pool=ThreadPoolExecutor(4)

19 start=time.time()

20 for i in range(1,5):

21 future=pool.submit(task,i)

22 future.add_done_callback(parse) #parse会在futrue有返回值时立刻触发,并且将future当作参数传给parse

23 pool.shutdown(wait=True)

24 stop=time.time()

25 print('主',current_thread().name,(stop - start))

并发实现套接字通信

服务端

客户端

扩展:

回调函数(callback)是什么?

以下均来自知乎:

python进程池和线程池_Python中的进程池与线程池(包含代码)相关推荐

  1. python进程process类返回值_Python 中的进程

    封面图片来源:沙沙野 内容概览进程必备的理论基础 进程的概念 并行和并发 进程的三状态 同步异步 进程模块 关于进程必备的理论基础操作系统的作用隐藏丑陋复杂的硬件接口,提供良好的抽象接口 管理.调度进 ...

  2. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  3. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

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

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

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

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

  6. linux多进程server 进程池_Python 中的进程池与多进程

    封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...

  7. python协程和线程区别_Python中进程、线程、协程及其区别

    以下为复制内容: https://blog.csdn.net/mr__l1u/article/details/81772073 1> 进程.线程和协程的认识: 进程是系统进行资源分配和调度的独立 ...

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

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

  9. python线程暂停恢复退出_python中的暂停和恢复线程

    请记住,在Pythin中使用线程不会授予您并行处理,除非是IO阻塞操作.有关这方面的更多信息,请查看this和this 在Python中,不能任意暂停线程(请记住这一点,然后再进一步阅读).我也不确定 ...

最新文章

  1. FFT2 图像二维FFT含义解释
  2. jscript错误代码及相应解释大全
  3. JDBC连接数据库经验集萃
  4. 我的世界服务器物品展示框,我的世界怎么展示框物品 展示框攻略
  5. 枚举所有进程及其ID
  6. javascript 常量_JavaScript中的常量
  7. python网络编程2-黏包问题
  8. node.js通过edge访问.net动态链接库
  9. 关于功能图标的绘制方法!
  10. 浪涌保护器ant120_菲尼克斯浪涌保护器
  11. 我读过关于面试最好的一篇文章
  12. 国内热门ERP软件有哪些推荐?
  13. Word文档太大怎样压缩变小?有没有简单的步骤讲解?
  14. oCPC实践录 | 糟糕,广告主成本超了!
  15. 从0到N建立高性价比的大数据平台
  16. 基于php的校园公寓管理系统设计与实现
  17. 3Dcnn 降假阳性模型调试(七)
  18. 十个鲜为人知的Linux命令-【4】
  19. 2021.2.23课程摘要(逻辑教育-王劲胜)
  20. extmail mysql数据库 重启_extmail数据库dspam表修复

热门文章

  1. Python+flask+flask-email发送带附件的电子邮件
  2. python selenium 点击加载更多_如何等待页面加载,然后按selenium中的“加载更多”按钮?...
  3. 电脑屏幕卡住了按什么都没反应_刚买2个月,联想电脑屏幕出现坏点,售后回复:坏点不够3个不能保修...
  4. Linux 10分钟掌握Linux常用开发工具及编译的四个过程
  5. 接口数组 java_java 数组和集合
  6. oracle rda结果,Oracle诊断工具-RDA使用
  7. php数组是有序,php判断一个数组是否为有序的方法
  8. python中quad_python – 沿quadmesh的x轴的日期
  9. vue 地图使用navigator_weex踩坑之旅第五弹 ~ 使用navigator内置模块实现导航
  10. html中select标签乱码,select 的过程中中文乱码有关问题求教