1 usePool.py

#coding: utf-8
"""
学习进程池使用 multiprocessing.Pool
总结:
1. Pool 池用于处理 多进程,并不是多线程
2. 池有大小的概念
3. 并不是所有的子进程添加完了,才开始启动子进程。 当第一个进程添加到池中的时候,马上就启动了 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 往池中添加进程 主要:pool.apply_async(func, (参数, )) or pool.apply(func, (参数, ))
3. 调用 pool.close(); pool.join() (一般伴随 apply_async),等待所有子进程结束 其他:
terminate() 结束工作进程,不再处理未完成的任务
map(...) 将一个集合数据 映射到 同一个函数, 根据集合大小 执行多次子进程
get() 从子进程获取返回结果
"""
import multiprocessing
import time # 进程代码
def func(msg):
print "sub begin:", msg
time.sleep(2)
print "sub end:",msg if __name__ == "__main__":
pool = multiprocessing.Pool(processes = 3) # 创建进程池
for i in xrange(5):
msg = " %d" %(i) # apply_async 非阻塞,一般和join一起使用, apply 阻塞 主进程等待子进程一个接一个执行完
# apply_async 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
# apply_async 这里创建的都是守护进程
pool.apply_async(func, (msg, )) # 实际开发中,每个子线程执行不同的逻辑
time.sleep(1)
print "alread start sub,%d\n" % i print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"
pool.close() # 关闭pool使其不在接受新的任务,必须有
pool.join() # 等待所有子进程结束 调用join之前,先调用close函数,
print "Sub-process(es) done." """
pool.apply_async
Out: sub begin: 0
alread start sub,0 sub begin: 1
alread start sub,1 sub begin: 2
sub end: 0
sub end: 1alread start sub,2 sub begin: 3
alread start sub,3 sub begin: 4
sub end: 2
sub end:alread start sub,4
3 Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
sub end: 4
Sub-process(es) done. """ """
pool.apply
Out: sub begin: 0
sub end: 0
alread start sub,0 sub begin: 1
sub end: 1
alread start sub,1 sub begin: 2
sub end: 2
alread start sub,2 sub begin: 3
sub end: 3
alread start sub,3 sub begin: 4
sub end: 4
alread start sub,4 Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done. """

2 usePoolmap.py

# -*- coding: utf-8 -*-
"""
使用 multiprocessing.Pool.map 执行多进程 逻辑:
有10个大小的列表,进程池4个大小
使用map执行完 总结:
可以简化启动子进程代码 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 准备list 数据 i_list = range(10)
3. 准备子进程执行代码 函数 sub_process_code
4. 调用 pool.map(sub_process_code, i_list)

pool.map_async(sub_process_code, i_list)
pool.close()
pool.join() """
import multiprocessing
import time
import os
def sub_process_code(x):
# 打印 hh:ss 编号 进程ID
print time.strftime('%M:%S',time.localtime(time.time())),x * x,os.getpid()
time.sleep(3) if __name__ == '__main__':
pool = multiprocessing.Pool(multiprocessing.cpu_count()) # 根据CPU数量创建进程池,这里是4个
i_list = range(10)
pool.map(sub_process_code, i_list) ## 下面3行代码 = 上面一行代码
# pool.map_async(sub_process_code, i_list) # 异步
# pool.close()
# pool.join() # 如果没有join,主进程 结束后,所有子进程马上结束了
print "end" """
Out: 24:20 0 5960
24:20 1 5840
24:20 4 5892
24:20 9 6944
24:23 16 5960
24:23 25 5840
24:23 36 5892
24:23 49 6944
24:26 64 5960
24:26 81 5840
end """

3 usePoolgetData.py

# -*- coding: utf-8 -*-
"""
使用进程池 multiprocessing.Pool,获取子进程的返回数据 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 往池中添加进程,同时拿到Result对象 p_ApplyResult_obj = pool.apply_async(func, (参数, ))
3. 调用 pool.close(); pool.join() 等待所有子进程结束
4. 获取子进程的返回数据 p_ApplyResult_obj.get()
""" import multiprocessing
import time # 子进程代码,会return 数据给主进程
def func(msg):
time.sleep(3)
print "end"
return "return " + msg if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = [] # 存储Result对象 for i in xrange(3):
msg = "hello %d" %(i)
# 添加子进程的同时,获取它的返回对象
p_ApplyResult_obj = pool.apply_async(func, (msg, ))
print id(p_ApplyResult_obj) # 打印pool对象 ID
result.append(p_ApplyResult_obj)
pool.close()
pool.join()
for res in result:
print ":::", res.get() # 获取子进程的return结果
print "Sub-process(es) done." """
Out: 41974752
41974864
41975032
endend end
::: return hello 0
::: return hello 1
::: return hello 2
Sub-process(es) done.
"""

4 usePoolCallback.py 使用回调函数

# -*- coding: utf-8 -*-
"""
进程池 回调函数 逻辑: 子进程返回值结束,主进程马上调用回调 函数接收返回值,并打印
总结:
1、回调函数是子进程结束时,由主进程调用的函数
2、个人理解 类似 事件-驱动-动作机制 信号-动作机制 数据库触发器机制
事件 子进程执行结束
动作 执行回调函数 用法:
1. 准备子进程函数Foo, 里面有返回值
2. 准备回调函数Bar,接收参数就是子进程返回值
3. pool.apply_async(func=Foo, args=(i,), callback=Bar)
Foo的参数 是 args
Bar的参数 是 Foo的返回值 """
from multiprocessing import Pool
import time def Foo(i):
"""
字进程代码
:param i:
"""
time.sleep(2)
print i
return i+100 def Bar(arg):
"""
回调函数
:param arg: 子进程执行代码返回值 ,本例是 Foo return i+100
"""
print('----->exec done:',arg) if __name__ == '__main__': # 允许进程池里同时放入5个进程
pool = Pool(5) # 启动10个进程
for i in range(10): # 并行执行,callback回调执行者为父进程
pool.apply_async(func=Foo, args=(i,), callback=Bar) #pool.apply(func=Foo, args=(i,)) # 串行执行 print('end')
pool.close()
pool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。 """
Out: end
0
('----->exec done:', 100)
1
('----->exec done:', 101)
2
('----->exec done:', 102)
3
('----->exec done:', 103)
4
('----->exec done:', 104)
5
('----->exec done:', 105)
6
('----->exec done:', 106)
7
('----->exec done:', 107)
8
('----->exec done:', 108)
9
('----->exec done:', 109)
"""

参考:

python进程池:multiprocessing.pool

[b0030] python 归纳 (十五)_多进程使用Pool的更多相关文章

  1. [b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore

    # -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡 ...

  2. Python爬虫(十五)_案例:使用bs4的爬虫

    本章将从Python案例讲起:所使用bs4做一个简单的爬虫案例,更多内容请参考:Python学习指南 案例:使用BeautifulSoup的爬虫 我们已腾讯社招页面来做演示:http://hr.ten ...

  3. [b0041] python 归纳 (二六)_多进程数据共享和同步_事件Event

    # -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制 ...

  4. [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock

    # -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...

  5. [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe

    # -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...

  6. [b0036] python 归纳 (二一)_多进程数据共享和同步_服务进程Manager

    # -*- coding: utf-8 -*- """ 多进程数据共享 服务器进程 multiprocessing.Manager 入门使用 逻辑: 20个子线程修改共享 ...

  7. [b0034] python 归纳 (十九)_线程同步_条件变量

    代码: # -*- coding: utf-8 -*- """ 学习线程同步,使用条件变量 逻辑: 生产消费者模型 一个有3个大小的产品库,一个生产者负责生产,一个消费者 ...

  8. [b0027] python 归纳 (十二)_并发队列Queue的使用

    # -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 ...

  9. Python笔记(十五)_异常处理

    try-except语句 try: 被检测代码 except Exception [as reason]: 出现异常后的处理代码 例: try: sum = 1+' f=open('未定义文件.txt ...

随机推荐

  1. Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  2. ubuntu18.10 上安装docker容器

    网上有的安装步骤太复杂,并且安装过程中容易出错,其它安装不难,只需一条命令即可. 安装成功后,使用命令查看docker状态 systemctl status docker 安装前更新下包源 sudo ...

  3. javascript模块化开发(二)

    模块化开发(一) ES6模块化 详解 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict". 顶层的this指向undefined,即不应该在顶层代码 ...

  4. Android Studio 3.0 及以上版本使用技巧总结

    1.更新Android Studio后下载Gradle文件的技巧 更新到3.0版本后,可能会出现创建新项目一直停留在如下图的界面: 选择等待?不知道要等到什么时候,这时候怎么办呢?显然,不能一直等待下 ...

  5. 36-Docker 的两类存储资源

    我们从本章开始讨论 Docker 存储. Docker 为容器提供了两种存放数据的资源: 由 storage driver 管理的镜像层和容器层. Data Volume. 我们会详细讨论它们的原理和 ...

  6. more than 120 seconds|hung_task_timeout_secs 什么鬼?

    //2019/7/31 18:41:14掐指一算应该resore完了呀,是不是天热想罢工?不过已经差不多30个小时了无意间一查 tail -500f /var/log/messages 发现有些“mo ...

  7. python中基本数据类型以及运算符

    python中基本数据类型以及运算符的知识 一.与用户的交互以及python2与python的区别 1.1什么是与用户交互 用户交互就是人往计算机中input(输入数据),计算机print(输出结果) ...

  8. canvas详解----绘制线条

    <!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> &l ...

  9. 数据可视化-matplotlib包

    pyplot官网教程https://matplotlib.org/users/pyplot_tutorial.html #导入matplotlib的pyplot模块 import matplotlib ...

  10. 创建windows服务方法

    将exe程序创建windows服务 sc create TestService binpath= "c:/in estapp.exe" displayname= "Tes ...