Python说文解字_Python之多任务_03
问:线程学完了,现在我们开始学习进程了吧?
答:是的。前面说到线程就是我们的手,我们现在可以学习一下我们的“胳膊”了。
我们有了多线程,为什么还要学习多进程呢?这是因为在Python当中有一把GIL锁的存在,比如某些耗CPU的运算的时候,我们可以运行多进程多个CPU并发的操作进行操作。对于IO操作来说,我们的瓶颈不在于我们的CPU因此我们用多线程操作。进程切换操作不是轻量级的。
我们首先举例一个数据密集型的操作,来计算斐波那契数列:
from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import timedef fib(n):if n<=2:return 1return fib(n-1) + fib(n-2)if __name__ == '__main__':with ThreadPoolExecutor(3) as executor:all_task = [executor.submit(fib,(num)) for num in range(25,40)]start_time = time.time()for future in as_completed(all_task):data = future.result()print("get result:= {}".format(data))print("multithread last time is {}".format(time.time()-start_time))with ProcessPoolExecutor(3) as executor:all_task = [executor.submit(fib,(num)) for num in range(25,40)]start_time = time.time()for future in as_completed(all_task):data = future.result()print("get result:= {}".format(data))print("multiprocess last time is {}".format(time.time()-start_time)) # # multithread last time is 43.156678199768066 # multiprocess last time is 27.62783455848694
我们明显看到多进程比多线程快。
我们在以一个IO操作来进行对比:
from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import timedef random_sleep(n):time.sleep(n)return nif __name__ == '__main__':with ThreadPoolExecutor(3) as executor:all_task = [executor.submit(random_sleep,(num)) for num in [2]*30]start_time = time.time()for future in as_completed(all_task):data = future.result()print("get result:= {}".format(data))print("multithread last time is {}".format(time.time()-start_time))with ProcessPoolExecutor(3) as executor:all_task = [executor.submit(random_sleep,(num)) for num in [2]*30]start_time = time.time()for future in as_completed(all_task):data = future.result()print("get result:= {}".format(data))print("multiprocess last time is {}".format(time.time()-start_time)) # # multithread last time is 20.035860300064087 # multiprocess last time is 20.641016483306885
正式进入我们的进程操作:
import os import time # fork只能用于linux下面 pid = os.fork() print("bobby") if pid == 0:print("子进程{},父进程是{}".format(os.getpid(),os.getppid())) else:print("我是父进程:{}".format(pid))time.sleep(2)
这段代码只能在Linux下运行。我们发现的问题是如果主进程结束了,子进程还是会运行的。
问:进程如何进行编程?
答:我们懂了线程的编程,进程的编程会变得非常的简单。多余的内容就不再讲解,我们讲解一些不同的包,其实这些包的应用也是跟进程差不多的。
multiprocessing
import multiprocessing import time def get_html(n):time.sleep(n)return nif __name__ == '__main__':progress = multiprocessing.Process(target=get_html,args=(2,))progress.start()progress.join()
我们还可以直接获取进程的pid和ppid。
其他和我们多线程差不都就不详解了。
使用进程池:
进程池:Pool和ProcessPoolExecutor。后那个跟线程一样。我们单独说一下Pool这个进程池。
import multiprocessing import time from multiprocessing import Pooldef get_html(n):time.sleep(n)return nif __name__ == '__main__':progress = multiprocessing.Process(target=get_html,args=(1,))progress.start()progress.join()pool = Pool(multiprocessing.cpu_count())print(multiprocessing.cpu_count())result = pool.apply_async(get_html,args=(3,))pool.close()
注意最后要关闭线程池。详细的关于线程池的代码可以参照这里:https://www.cnblogs.com/noah0532/p/10938771.html
特别要说明的是有两个方法:imap 和 imap_unordered(这个是谁先完成先打印谁)
for result in pool.imap(get_html,[1,5,3]):
进程间的通信:
进程间的通信和线程间的通信有一样的也有不一样的地方,比如锁就不能使用了。
举一个简单的例子:用队列进行通信
from multiprocessing import Process,Queue # from queue import Queue # 这个queue就不能用了 import timedef producer(queue):queue.put("a")time.sleep(2)def consumer(queue):time.sleep(2)data = queue.get()print(data)if __name__ == '__main__':queue = Queue(10)my_producer = Process(target=producer,args=(queue,))my_consumer = Process(target=consumer, args=(queue,))my_producer.start()my_consumer.start()my_producer.join()my_consumer.join()
在多进程的编程中不能用之前的queue了,带用multiprocessing里面的queue,这一带你要注意
我们再举一个共享变量的例子:
from multiprocessing import Process import timedef producer(a):a += 1time.sleep(2)def consumer(a):time.sleep(2)print(a)if __name__ == '__main__':a = 1my_producer = Process(target=producer,args=(a,))my_consumer = Process(target=consumer, args=(a,))my_producer.start()my_consumer.start()my_producer.join()my_consumer.join()
我们发现我们的全局变量不能用了,正如我们前面说的,我们再进程中每一块的变量是单独的,不能共享的。
另外multiprocessing中的queue也不能用在进程池当中。如果我们想在进程当中应用就带用Manager当中的Queue
from multiprocessing import Process,Queue,Manager,Pool import timedef producer(queue):queue.put("a")time.sleep(2)def consumer(queue):time.sleep(2)data = queue.get()print(data)if __name__ == '__main__':queue = Manager().Queue(10)pool = Pool(2)pool.apply_async(producer,args=(queue,))pool.apply_async(consumer, args=(queue,))pool.close()pool.join()
另外,我们还可以通过我们的pipe管道来进行通讯,但是Pipe只能使用两个进程间的通信,如果是两个交换pipe的性能比queue高
from multiprocessing import Process,Queue,Manager,Pool,Pipe import timedef producer(pipe):pipe.send("bobby")def consumer(pipe):print(pipe.recv())if __name__ == '__main__':# pipe只能用于两个进程间的通讯receive_pipe,send_pipe = Pipe()my_producer = Process(target=producer,args=(send_pipe,))my_consumer = Process(target=consumer, args=(receive_pipe,))my_producer.start()my_consumer.start()my_producer.join()my_consumer.join()
重点:进程间的共享内存操作:Manager().dict(),array()....常用的数据类型都有。
from multiprocessing import Process,Queue,Manager,Pool,Pipedef add_data(p_dict,key,value):p_dict[key] = valueif __name__ == '__main__':progress_dict = Manager().dict()first_progess = Process(target=add_data,args=(progress_dict,"bobby1",22))second_progess = Process(target=add_data, args=(progress_dict, "bobby1", 23))first_progess.start()second_progess.start()first_progess.join()second_progess.join()print(progress_dict) # {'bobby1': 23}
转载于:https://www.cnblogs.com/noah0532/p/11011976.html
Python说文解字_Python之多任务_03相关推荐
- Python说文解字_杂谈06
1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...
- 全字库说文解字字体_整理了10款免费商用中文字体,超好用
文章来源:logo设计视觉(ID:logoshijue) 字体不能随便用!大家应该经常有听到字体侵权索赔上几十上百万事吧!作为小小的设计师遇上了就倒霉啦!所以,我们要有足够版权意识,没事囤点免费可商用 ...
- 全字库说文解字字体_【180期】可商用字体大全,无版权纠纷!
大家好我是万能的向前 今天向前为你精选了 可商用字体最全收集免费,无版权纠纷 每个设计高手都离不开百变的字体,但是,如果审美不到位字库不全,找不到合适的字体,领导.客户就相不中!那就有可能被降薪,糟心 ...
- 说文解字 —— 拆字
1. 说文解字 美: 羊大为美:所以有肥美嘛 2. 世说新语 皇: 王上加白: 工人: 工人就是天: 3. 复杂词语 三星期,六点钟:三星期为二十一,六点钟为酉时的酉:加在一起就是醋: 4. 数字 7 ...
- 嘻嘻哈哈说文解字(讲)
讲的左边是言,右边是井,我想,老祖宗造这个字的意思应该是:话是应该说,但不能说多,不能井边说,言空了就掉井里了(所谓言虚容易掉到井里面).但奈何我们的记忆总不好,只记住了左边的言,这不,你看我们天天都 ...
- java 词根_英语词根与单词的说文解字---词根示例1、第10页 st(at)
英语词根与单词的说文解字---词根示例1.第10页 st(at) 一.总结 一句话总结: 站 state,establish,constitution 英 [ɪ'stæblɪʃ; e-] 美 [ɪˈ ...
- 读书笔记(四)---读《说文解字》的快乐点滴
想读这本书的缘由在于,我经常背英语单词:为了更牢靠的记住英语单词,使用了某些例如按词根记住单词的技巧,突然想到自己对汉字也有很多是不认识的,学习一门外语花了这么大力气,为何学习母语反而不下工夫呢?于是 ...
- 曲刚英语说文解字全套下载
买了曲刚英语说文解字全套已经学完了,因为都是电子录像,所以想转让一下,有兴趣的可以联系我,已经解决其他机器上无法播放的问题? 联系方式q.q:375501819 下载地址可以联系我~
- 快步英语说文解字颠覆中国传统英语教学模式
原文出处 http://tinyurl.com/43637676 快步7号说文解字里面内容到底教了那些呢 中国近百年来沉闷压抑僵死的英语教学困境终于迎来颠覆性.震撼性突破,横空出世的曲刚英语语音大表. ...
- 《说文解字》与程序设计
说文解字 领券网 https://www.cps3.cn/ <说文解字>,简称<说文>,是由东汉经学家.文字学家许慎编著的语文工具书著作.<说文解字>是中国最早的系 ...
最新文章
- 刘昊天:以数据思维助力工程实践 | 提升之路系列(十一)
- 在实际项目中如何应用门面模式(Facade)
- Error during artifact deployment. See server log for details解决办法
- 阿尔法大蛋智能机器人功能_智能机器人怎么选?阿尔法蛋大蛋2.0助力孩子新学期...
- java 反取字符串
- matplotlib调整图例的位置
- 分享一篇关于社区团购的竞品分析
- SageMath安装及使用
- HTML-HTML基本语法和标签
- Excel自动换行、Export2Excel 自动换行
- 电视剧《赘婿》宁毅与乌家的岁布战没怎么看懂,可以细致分析一下吗?
- centos使用迅雷远程下载
- maven profile <filtering>true</filtering>的作用
- python安装mysqldb报错
- [HTML5-SVG]SVG是什么?SVG有什么用途?
- SWUST OJ 954单链表的链接
- 你的手指上有几个螺(斗)?指纹决定你的性格
- 2020中国卓越管理公司颁奖晚宴成功举办,四家香港科大EMBA校友企业获奖
- STM32单片机接直流减速电机编码器注意点
- 阿里巴巴与蚂蚁集团开源框架SOFA Boot