• 引入进程池
  • 使用ProcessPoolExecutor进程池
  • 使用shutdown
  • 使用submit同步调用
  • 使用submit异步调用
  • 进程池实现ftp

引入进程池

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

from multiprocessing import  Process
import  time
def task(name):print("name",name)time.sleep(1)if __name__ == "__main__":start = time.time()p1 = Process(target=task,args=("safly1",))p2 = Process(target=task, args=("safly2",))p3 = Process(target=task, args=("safly3",))p1.start()p2.start()p3.start()p1.join()p2.join()p3.join()print("main")end = time.time()print(end- start)

输出如下:

name safly1
name safly2
name safly3
main
1.2071197032928467

以上的方式是一个个创建进程,这样的耗费时间才1秒多,虽然高效,但是有什么弊端呢?
如果并发很大的话,会给服务器带来很大的压力,所以引入了进程池的概念

使用ProcessPoolExecutor进程池

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

通过ProcessPoolExecutor 来做示例。
我们来看一个最简单的进程池

from concurrent.futures import ProcessPoolExecutor
import  time
def task(name):print("name",name)time.sleep(1)if __name__ == "__main__":start = time.time()ex = ProcessPoolExecutor(2)for i in range(5):ex.submit(task,"safly%d"%i)ex.shutdown(wait=True)print("main")end = time.time()print(end - start)

输出如下:

E:\python\python_sdk\python.exe "E:/python/py_pro/4 进程池.py"
name safly0
name safly1
name safly2
name safly3
name safly4
main
3.212218999862671

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

使用shutdown

ex.shutdown(wait=True)是进程池内部的进程都执行完毕,才会关闭,然后执行后续代码
如果改成false呢?看如下代码

from concurrent.futures import ProcessPoolExecutor
import  time
def task(name):print("name",name)time.sleep(1)if __name__ == "__main__":start = time.time()ex = ProcessPoolExecutor(2)for i in range(5):ex.submit(task,"safly%d"%i)ex.shutdown(wait=False)print("main")end = time.time()print(end - start)

输出如下:

main
0.01500844955444336
name safly0
name safly1
name safly2
name safly3
name safly4

使用submit同步调用

同步调用:提交/调用一个任务,然后就在原地等着,等到该任务执行完毕拿到结果,再执行下一行代码

from concurrent.futures import ProcessPoolExecutor
import time, random, osdef piao(name, n):print('%s is piaoing %s' % (name, os.getpid()))time.sleep(1)return n ** 2if __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)

输出如下:

E:\python\python_sdk\python.exe "E:/python/py_pro/4 进程池.py"
safly 0 is piaoing 12996
0
safly 1 is piaoing 14044
1
safly 2 is piaoing 12996
4
safly 3 is piaoing 14044
9
safly 4 is piaoing 12996
16
主 12932
5.202786684036255Process finished with exit code 0

使用submit异步调用

异步调用: 提交/调用一个任务,不在原地等着,直接执行下一行代码


# from multiprocessing import Process,Pool
from concurrent.futures import ProcessPoolExecutor
import time, random, osdef piao(name, n):print('%s is piaoing %s' % (name, os.getpid()))time.sleep(1)return n ** 2if __name__ == '__main__':p = ProcessPoolExecutor(2)objs = []start = time.time()for i in range(5):obj = p.submit(piao, 'safly %s' % i, i)  # 异步调用objs.append(obj)p.shutdown(wait=True)print('主', os.getpid())for obj in objs:print(obj.result())stop = time.time()print(stop - start)

输出如下:

E:\python\python_sdk\python.exe "E:/python/py_pro/4 进程池.py"
safly 0 is piaoing 1548
safly 1 is piaoing 7872safly 2 is piaoing 1548
safly 3 is piaoing 7872safly 4 is piaoing 1548主 7808
0
1
4
9
16
3.202626943588257

输出信息的换行是我标识有输出停顿的
简单说下执行流程:
由于进程池容量是容纳2个进程,所以会2+2+1 三次进入线程池执行,花费3秒

如果我们改下上面的代码,修改的代码如下:

from concurrent.futures import ProcessPoolExecutor
import time, random, osdef piao(name, n):print('%s is piaoing %s' % (name, os.getpid()))time.sleep(1)return n ** 2if __name__ == '__main__':p = ProcessPoolExecutor(2)objs = []start = time.time()for i in range(5):obj = p.submit(piao, 'safly %s' % i, i)  # 异步调用objs.append(obj)for obj in objs:print(obj.result())p.shutdown(wait=True)print('主', os.getpid())stop = time.time()print(stop - start)

输出如下:(同样我用换行,标识出输出的时间段了)

E:\python\python_sdk\python.exe "E:/python/py_pro/4 进程池.py"
safly 0 is piaoing 7852
safly 1 is piaoing 8484safly 2 is piaoing 7852
0
safly 3 is piaoing 8484
1safly 4 is piaoing 7852
4
916
主 6816
3.178352117538452

进程池实现ftp

服务端:

from socket import *
from concurrent.futures import ProcessPoolExecutor
import osserver=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(('127.0.0.1',8080))
server.listen(5)def talk(conn,client_addr):print('进程pid: %s' %os.getpid())while True:try:msg=conn.recv(1024)if not msg:breakconn.send(msg.upper())except Exception:breakif __name__ == '__main__':p=ProcessPoolExecutor(5)while True:conn,client_addr=server.accept()p.submit(talk,conn,client_addr)

客户端:

from socket import *client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:msg=input('>>: ').strip()if not msg:continueclient.send(msg.encode('utf-8'))msg=client.recv(1024)print(msg.decode('utf-8'))

python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp相关推荐

  1. spring async 默认线程池_springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  2. delphi 异步 调用 带参数_如何在 Spring 异步调用中传递上下文

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行.异步调用指,在程序在执行时,无 ...

  3. delphi 异步 调用 带参数_Dubbo 关于同步/异步调用的几种方式

    我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用 异步调用 参数回调 事件通知 同步调用 同 ...

  4. Python基础编程——多重继承下方法的调用

    我们介绍了在继承下面调用父类的构造方法,那么在多重继承下如何调用父类的方法呢?虽然在使用多重继承时需要慎重,但是在实际的项目开发中多重继承却随处可见,因此了解多重继承下调用父类的方法也是很有必要的. ...

  5. 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys

    目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...

  6. Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象...

    一.拾遗 1.通常情况下无参函数只是进行操作,所以不需要返回值:有参数函数则需要返回值. 2.练习: 判断用户输入一串字符,如果这串字符的长度小于5则重新输入,如果大于5则退出循环. while Tr ...

  7. python 进程池、线程池 与异步调用、回调机制

    进程池.线程池使用案例 from concurrent.futures import ProcessPoolExecutor # 进程池模块 from concurrent.futures impor ...

  8. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

  9. Python基础教程:线程操作(oncurrent模块)详解

    进程是cpu资源分配的最小单元,一个进程中可以有多个线程. 线程是cpu计算的最小单元. 对于Python来说他的进程和线程和其他语言有差异,是有GIL锁. GIL锁 GIL锁保证一个进程中同一时刻只 ...

最新文章

  1. void关键字的使用规则
  2. 设计模式篇——初探装饰器模式
  3. createinstance.java,weex android 0.17.0 createInstance fail
  4. cxGrid, 和AfterScroll
  5. 基于按位与的 就散策略_比较散列策略
  6. docker 安装azkaban_azkaban安装
  7. Uva 10817 校长的烦恼
  8. 工厂供电技术实训设备QY-PGD19
  9. Visual Studio中C++关于Unicode字符集和多字节字符集
  10. U盘插入电脑说要格式化,但电脑又说“磁盘被写保护,无法格式化”,如何解决
  11. android 播放pcm的软件,应用AudioTrack播放PCM音频数据(android)
  12. New Age音乐启蒙与经典选介
  13. linux skb机制,skb 的分配细节
  14. QNX Hypervisor —— 物理设备
  15. 机器学习-神经网络(Neural Network)算法
  16. 学信息安全买计算机,大学学习计算机类信息安全方向真的很蠢吗?
  17. 使用Eclipse开发Python
  18. 计算机安全措施方案,计算机安全应急预案
  19. win11右键新建菜单添加选项
  20. Python数据可视化 Pyecharts 制作 Line3D 3D折线图

热门文章

  1. 全网最全无坑!!! Centos8环境 安装MySQL8 (单机版详细部署及问题汇总)
  2. 初探Netty:Netty原理、核心组件、数据容器以及运行机制
  3. 阻塞和非阻塞、同步和异步的三篇笔记
  4. 解析oracle的dump文件,读懂数据块dump文件信息
  5. 求与数字最接近的 2 的 N 次方(转载)
  6. [面试题]java中final finally finalized 的差别是什么?
  7. 【日常】我的扬马最后一小时
  8. MAT 分析堆内存快照
  9. 手把手带你解决OBS Studio 无法录屏的问题
  10. 个人创业了,做了个网站和App,www.91tianwu.com