Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。

1. 使用进程池

import multiprocessing

import time

def func(msg):

print("msg:", msg)

time.sleep(3)

print("end")

if __name__ == "__main__":

pool = multiprocessing.Pool(processes = 3)

for i in range(4):

msg = "hello%d" %(i)

pool.apply_async(func, (msg, )) #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")

pool.close()

pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

print("Sub-process(es) done.")

输出:

Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~

msg: hello 0

msg: hello 1

msg: hello 2

end

msg: hello 3

end

end

end

Sub-process(es) done.apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的(理解区别,看1和2结果区别)

close() 关闭pool,使其不在接受新的任务。

terminate() 结束工作进程,不在处理未完成的任务。

join() 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用.

执行说明:创建一个进程池pool,并设定进程的数量为3,range(4)会相继产生四个对象[0, 1, 2, 3],四个对象被提交到pool中,因pool指定进程数为3,所以0、1、2会直接送到进程中执行,当其中一个执行完事后才空出一个进程处理对象3,所以会出现输出“msg: hello 3”出现在"end"后。因为为非阻塞,主函数会自己执行自个的,不搭理进程的执行,运行完for循环后直接输出“Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~”(可能为其他结果. 如: mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~ello 0),主程序在pool.join() 处等待各个进程的结束。

2. 使用进程池(阻塞)

import multiprocessing

import time

def func(msg):

print("msg:", msg)

time.sleep(3)

print("end")

if __name__ == "__main__":

pool = multiprocessing.Pool(processes = 3)

for i in range(4):

msg = "hello%d" %(i)

pool.apply(func, (msg, )) #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")

pool.close()

pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

print("Sub-process(es) done.")

输出:

msg: hello 0

end

msg: hello 1

end

msg: hello 2

end

msg: hello 3

end

Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~

Sub-process(es) done.

3. 使用进程池,并关注结果

import multiprocessing

import time

def func(msg):

print("msg:", msg)

time.sleep(3)

print("end")

return "done " + msg

if __name__ == "__main__":

pool = multiprocessing.Pool(processes=4)

result = []

for i in range(3):

msg = "hello%d" %(i)

result.append(pool.apply_async(func, (msg, )))

pool.close()

pool.join()

for res in result:

print(":::", res.get())

print("Sub-process(es) done.")

输出:

msg: hello 0

msg: hello 1

msg: hello 2

end

end

end

::: done hello 0

::: done hello 1

::: done hello 2

Sub-process(es) done.get()函数得出每个返回结果的值

4. 使用多个目标函数

import multiprocessing

import os, time, random

def Lee():

print("\nRun task Lee-%s" % (os.getpid())) # os.getpid()获取当前的进程的ID

start = time.time()

time.sleep(random.random() * 10) # random.random()随机生成0-1之间的小数

end = time.time()

print('Task Lee, runs%0.2fseconds.' % (end - start))

def Marlon():

print("\nRun task Marlon-%s" % (os.getpid()))

start = time.time()

time.sleep(random.random() * 40)

end = time.time()

print('Task Marlon runs%0.2fseconds.' % (end - start))

def Allen():

print("\nRun task Allen-%s" % (os.getpid()))

start = time.time()

time.sleep(random.random() * 30)

end = time.time()

print('Task Allen runs%0.2fseconds.' % (end - start))

def Frank():

print("\nRun task Frank-%s" % (os.getpid()))

start = time.time()

time.sleep(random.random() * 20)

end = time.time()

print('Task Frank runs%0.2fseconds.' % (end - start))

if __name__ == '__main__':

function_list = [Lee, Marlon, Allen, Frank]

print("parent process%s" % (os.getpid()))

pool = multiprocessing.Pool(4)

for func in function_list:

pool.apply_async(func) # Pool执行函数,apply执行函数,当有一个进程执行完毕后,会添加一个新的进程到pool中

print('Waiting for all subprocesses done...')

pool.close()

pool.join() # 调用join之前,一定要先调用close() 函数,否则会出错, close()执行后不会有新的进程加入到pool,join函数等待素有子进程结束

print('All subprocesses done.')

输出;

parent process 89128

Waiting for all subprocesses done...

Run task Lee-42544

Run task Marlon-90952

Run task Allen-86188

Run task Frank-92504

Task Lee, runs 3.49 seconds.

Task Marlon runs 10.92 seconds.

Task Frank runs 12.82 seconds.

Task Allen runs 18.44 seconds.

All subprocesses done.

5. multiprocessing pool map

import multiprocessing

def m1(x):

print(x * x)

if __name__ == '__main__':

pool = multiprocessing.Pool(multiprocessing.cpu_count())

i_list = range(8)

pool.map(m1, i_list)

输出:

0

1

4

9

16

25

36

49

python 进程池阻塞和非阻塞_python进程池:multiprocessing.pool相关推荐

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

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

  2. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

  3. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  4. python并发处理同一个文件_python并发编程(并发与并行,同步和异步,阻塞与非阻塞)...

    最近在学python的网络编程,学会了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但 ...

  5. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

  6. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)

    本文主要向大家介绍了Python语言之python并发原理(阻塞.非阻塞.epoll),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在Linux系统中 01 阻塞服务端 特征: ...

  7. python复制文件夹不阻塞_python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步...

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  8. linux 查看进程阻塞,linux进程 阻塞和非阻塞操作

    在我们看全功能的 read 和 write 方法的实现之前, 我们触及的最后一点是决定何时使 进程睡眠. 有时实现正确的 unix 语义要求一个操作不阻塞, 即便它不能完全地进行下去. 有时还有调用进 ...

  9. 进程资源图,化简,阻塞(非阻塞),死锁

    如果一个图可完全简化,则不会产生死锁:如果一个图不可完全简化(即:图中还有"边"存在),则会产生死锁.这就是"死锁定理". 有边就是死锁 例题一 在如下所示的进 ...

  10. 探究并发和并行、同步和异步、进程和线程、阻塞和非阻塞、响应和吞吐等

    一. 并发和并行 操作系统扫盲: 1. 对于单核cpu而言(不管单核单线程也好,单核多线程也罢),同一时间只能干一件事!!为了看起像可以"同时干多件事",windows操作系统把c ...

最新文章

  1. shell 脚本 进行sqlite3初始化
  2. linux socket关闭连接 shutdown与close
  3. SAP CRM HANA report里 默认filter 的工作机制分析
  4. 王者荣耀scratch版
  5. 2016新网商年度盛典,千机网解构新零售
  6. 硬件工程师面试常见问题
  7. 你知道你的手机上有哪些传感器吗?
  8. 【已解决】微信内置浏览器清缓存
  9. wps图片与图片间距怎么调整_wps图片与图片间距怎么调整_微信图文排版,字间距,行间距,怎么调整合适?......
  10. 手把手教你如何将chatgpt接入微信公众号
  11. Django聚合分组查询(F与Q查询|ORM查询优化|常见字段参数)
  12. 离线安装ceph集群(ceph-13.2.10)
  13. 提高pyautogui识图率的优化方案
  14. arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg
  15. 玉米社:seo优化推广 网站收录一直不太好什么原因?
  16. this.$refs 获取不到解决办法
  17. 百度地圖定位setScanSpan無效的問題
  18. 前端小游戏(强烈推荐)
  19. 爱回收急于IPO背后:创始人提前减持,路径像极了“优信”
  20. 情人节 为程序员正名

热门文章

  1. [软件人生]人格美容与素质和教养
  2. 异化之地未能成功连接服务器,异化之地特殊房间出不去怎么办
  3. 【工作感悟】下班随笔——IC验证日常工作感悟
  4. RocketMQ集群部署结构
  5. 超详细Xshell7免费版安装与连接虚拟机教程
  6. 摄像头在线测试_9月19日组织心理咨询专业技能考试系统测试
  7. Mac上的BG Renderer MAX(ae多线程渲染工具)
  8. notepad添加16进制编辑插件
  9. 丰乳肥臀与眼球 BLOG与互联网泡沫
  10. 信息技术必修丨计算机基础练习题(附答案)