老男孩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,包导入是把计算机上的 ...
随机推荐
- java和maven环境变量设置,Tomcat部署
Java环境变量设置 Win10我的电脑右击属性,高级系统设置,高级,环境变量设置 新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program F ...
- 【css】IE盒子模型和标准W3C盒子模型
其实盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型. 1.标准盒子 从上图可以看到标准 W3C 盒子模型的范围包括 margin.border.padding.content,并且 c ...
- 初学Python——Socket网络编程
认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机 ...
- Java关键字(六)——super
在 Java关键字(五)——this 中我们说 this 关键字是表示当前对象的引用.而 Java 中的 super 关键字则是表示 父类对象的引用. 我们分析这句话“父类对象的引用”,那说明我们使用 ...
- 01-vue学习篇-以优雅的姿势创建vue项目
前言 小白一枚,今年(2019)准备学习一下前端的技术,因为发现自己对后端(python)相对比较熟悉但是还是写不出一个优雅的系统,可见前端的重要性,于是静下心来跟大佬学习.在不断的激励自己调整自己的 ...
- .net core实践系列之短信服务-Sikiro.SMS.Job服务的实现
前言 本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替.但是为了说明调度任务使用实现也 ...
- Python中for循环搭配else的陷阱
假设有如下代码: for i in range(10): if i == 5: print 'found it! i = %s' % i else: print 'not found it ...' ...
- 小程序解决方案 Westore - 组件、纯组件、插件开发
数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...
- 开源纯C#工控网关+组态软件(二)工控网关的实现
一. 工控网关是什么 网关是物联网和工控系统的核心组件.网关起的是承上启下的作用.上即上位机,电脑/触屏监控系统.MES这些:下即下位机,包括PLC.传感器.嵌入式芯片等. 不同厂家的下位机,往往 ...
- WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择
NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...