老男孩python学习自修第二十四天【多进程】
1. 体验多进程的运行速度
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from multiprocessing import Pool
import time
def foo(n):
time.sleep(1)
return n * n
if __name__ == "__main__":
pool = Pool(10)
data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 这里只需要等待1S就能得到结果, 因为使用了多进程
print pool.map(foo, data_list)
# 这里需要等待10S 才能得到结果, 因为没有使用多进程
print map(foo, data_list)
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test.py [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] Process finished with exit code 0
注意:
(1)多进程的优势在于充分利用多核优势,因为多线程都是利用单核,只有多进程才能利用多核
2.子进程与父进程的关系
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from multiprocessing import Process
import os
def info(title):
print "+++++++++++++" + title + "++++++++++++++"
if hasattr(os, 'getppid'):
print "ppid: %d" % os.getppid()
print "pid: %d" % os.getpid()
if __name__ == "__main__":
info("main process")
process = Process(target=info, args=("other process", ))
process.start()
process.join()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_2.py +++++++++++++main process++++++++++++++ ppid: 490 pid: 593 +++++++++++++other process++++++++++++++ ppid: 593 pid: 594 Process finished with exit code 0
3.进程与线程的区别
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from multiprocessing import Process
from threading import Thread
def foo(li, item):
li.append(item)
print li
if __name__ == "__main__":
li = []
#注意:进程是不共享内存的,每个进程都有独立的内存空间;可以利用多核优势;是真正意义上的并发
print "+++++++++process+++++++++"
for item in range(5):
process = Process(target=foo, args=(li, item))
process.start()
process.join()
#注意:线程是共享同一份内存的,每个线程都在抢占内存空间;一个时间片只有一个线程占用内存;不是真正的并发
print "+++++++++thread++++++++++"
for item in range(5):
thread = Thread(target=foo, args=(li, item))
thread.start()
thread.join()
结果:
+++++++++process+++++++++ [0] [1] [2] [3] [4] +++++++++thread++++++++++ [0] [0, 1] [0, 1, 2] [0, 1, 2, 3] [0, 1, 2, 3, 4]
4. 实现进程间的内存共享(使用进程的队列)
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from multiprocessing import Process, Queue
def foo(que, item):
que.put(item)
if __name__ == "__main__":
que = Queue()
for item in range(5):
process = Process(target=foo, args=(que, item))
process.start()
while True:
print que.get()
结果:
1 2 0 3 4
5. 实现进程间的内存共享(使用Value和Array)
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from multiprocessing import Process, Value, Array
def foo(n, a):
n.value = 3.1415926
for i in range(len(a)):
a[i] = -a[i]
if __name__ == "__main__":
# 这里采用多进程提供的Value对象和Array对象
num = Value('d', 0)
arr = Array('i', range(10))
# 调用foo方法,修改子进程的内存数据
process = Process(target=foo, args=(num, arr))
process.start()
process.join()
# 打印主进程定义的使用Value和Array定义的数据,发现也被修改;从而断定子进程与主进程共享了内存空间
print num.value
print arr[:]
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_5.py 3.1415926 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] Process finished with exit code 0
6. 使用进程池开启进程
#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_
from multiprocessing import Pool
import time
def foo(x):
print x * x
time.sleep(1)
return x * x
if __name__ == "__main__":
# 这里定义进程池,每次最多只有4个进程并行运行
pool = Pool(processes=4)
res_list = []
for i in range(10):
# 开启新的进程并启动,相当于Process(target=foo, args=(i))
res = pool.apply_async(foo, (i, ))
# 要将进程的运行结果放入列表中,这时其实进程还还有执行函数foo
res_list.append(res)
for item in res_list:
# 只有在区结果的时候,进程才真正执行函数
print item.get()
结果:看见每个时间段只有4个进程运行
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_6.py 0 1 4 9 16 25 36 0 1 49 4 9 64 81 16 25 36 49 64 81 Process finished with exit code 0
老男孩python学习自修第二十四天【多进程】的更多相关文章
- 老男孩python学习自修第十四天【序列化和json】
序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...
- 老男孩python学习自修第十六天【常用模块之sys和os】
例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...
- 老男孩python学习自修第二十三天【多线程】
1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...
- 老男孩 python学习自修第二十二天【文件上传与下载】
1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...
- 老男孩python学习自修第十九天【异常处理】
1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...
- 老男孩python学习自修第十五天【常用模块之time】
例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...
- 老男孩python学习自修第十天【三元表达式与lambda表达式】
例如: 1.使用三元表达式给变量赋值 result = '空' if x == None else x 2.使用lambda定义函数 add = lambda x, y: x+y
- Python学习笔记(十四)
Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
- Python学习笔记(十四):模块高级
以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...
随机推荐
- 003_python内置的@staticmethod详解
python中的staticmethod 主要是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法(类似java的静态方法) 如果你去掉staticmethod,在方法中加 ...
- 使用 ctypes 进行 Python 和 C 的混合编程
Python 和 C 的混合编程工具有很多,这里介绍 Python 标准库自带的 ctypes 模块的使用方法. 初识 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库 ...
- C# GDI+双缓冲技术
我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...
- 理解koa2 之 async + await + promise
koa是下一代的Node.js web框架. 我们首先使用koa来实现一个简单的hello world吧!假如目前的项目结构如下: ### 目录结构如下: koa-demo1 # 工程名 | |--- ...
- Feature Extractor[ResNet]
0. 背景 众所周知,深度学习,要的就是深度,VGG主要的工作贡献就是基于小卷积核的基础上,去探寻网络深度对结果的影响.而何恺明大神等人发现,不是随着网络深度增加,效果就好的,他们发现了一个违背直觉的 ...
- Long类型参数传到前端精度丢失的解决方案
由于公司数据库表的id是利用雪花算法生成的,所以实体类里面定义的数据类型为Long.但是这个数据传到前端时,发生了精度丢失的现象.本文记录了从java后端的角度如何解决这个精度丢失的问题,便于 ...
- Python 学习 第十六篇:networkx
networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法.图是由顶点.边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系.顶点和边 ...
- 原生JS实现三级联动
代码实现 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...
- 领域驱动设计(DDD:Domain-Driven Design) 介绍
Eric Evans的“Domain-Driven Design领域驱动设计”简称DDD,Evans DDD是一套综合软件系统分析和设计的面向对象建模方法,本站Jdon.com是国内公开最早讨论DDD ...
- Baby Coins
题意 描述 Baby 今天清点自己的百宝箱啦,箱子里有n 种硬币,硬币的面值分别是:val[1],val[2],...,val[n],每种面值的硬币都恰好有2 个. Baby 实在闲的太无聊了,他想从 ...