问:线程学完了,现在我们开始学习进程了吧?

答:是的。前面说到线程就是我们的手,我们现在可以学习一下我们的“胳膊”了。

  我们有了多线程,为什么还要学习多进程呢?这是因为在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相关推荐

  1. Python说文解字_杂谈06

    1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...

  2. 全字库说文解字字体_整理了10款免费商用中文字体,超好用

    文章来源:logo设计视觉(ID:logoshijue) 字体不能随便用!大家应该经常有听到字体侵权索赔上几十上百万事吧!作为小小的设计师遇上了就倒霉啦!所以,我们要有足够版权意识,没事囤点免费可商用 ...

  3. 全字库说文解字字体_【180期】可商用字体大全,无版权纠纷!

    大家好我是万能的向前 今天向前为你精选了 可商用字体最全收集免费,无版权纠纷 每个设计高手都离不开百变的字体,但是,如果审美不到位字库不全,找不到合适的字体,领导.客户就相不中!那就有可能被降薪,糟心 ...

  4. 说文解字 —— 拆字

    1. 说文解字 美: 羊大为美:所以有肥美嘛 2. 世说新语 皇: 王上加白: 工人: 工人就是天: 3. 复杂词语 三星期,六点钟:三星期为二十一,六点钟为酉时的酉:加在一起就是醋: 4. 数字 7 ...

  5. 嘻嘻哈哈说文解字(讲)

    讲的左边是言,右边是井,我想,老祖宗造这个字的意思应该是:话是应该说,但不能说多,不能井边说,言空了就掉井里了(所谓言虚容易掉到井里面).但奈何我们的记忆总不好,只记住了左边的言,这不,你看我们天天都 ...

  6. java 词根_英语词根与单词的说文解字---词根示例1、第10页 st(at)

    英语词根与单词的说文解字---词根示例1.第10页 st(at) 一.总结 一句话总结: 站 state,establish,constitution 英 [ɪ'stæblɪʃ; e-]  美 [ɪˈ ...

  7. 读书笔记(四)---读《说文解字》的快乐点滴

    想读这本书的缘由在于,我经常背英语单词:为了更牢靠的记住英语单词,使用了某些例如按词根记住单词的技巧,突然想到自己对汉字也有很多是不认识的,学习一门外语花了这么大力气,为何学习母语反而不下工夫呢?于是 ...

  8. 曲刚英语说文解字全套下载

    买了曲刚英语说文解字全套已经学完了,因为都是电子录像,所以想转让一下,有兴趣的可以联系我,已经解决其他机器上无法播放的问题? 联系方式q.q:375501819 下载地址可以联系我~

  9. 快步英语说文解字颠覆中国传统英语教学模式

    原文出处 http://tinyurl.com/43637676 快步7号说文解字里面内容到底教了那些呢 中国近百年来沉闷压抑僵死的英语教学困境终于迎来颠覆性.震撼性突破,横空出世的曲刚英语语音大表. ...

  10. 《说文解字》与程序设计

    说文解字 领券网 https://www.cps3.cn/ <说文解字>,简称<说文>,是由东汉经学家.文字学家许慎编著的语文工具书著作.<说文解字>是中国最早的系 ...

最新文章

  1. 刘昊天:以数据思维助力工程实践 | 提升之路系列(十一)
  2. 在实际项目中如何应用门面模式(Facade)
  3. Error during artifact deployment. See server log for details解决办法
  4. 阿尔法大蛋智能机器人功能_智能机器人怎么选?阿尔法蛋大蛋2.0助力孩子新学期...
  5. java 反取字符串
  6. matplotlib调整图例的位置
  7. 分享一篇关于社区团购的竞品分析
  8. SageMath安装及使用
  9. HTML-HTML基本语法和标签
  10. Excel自动换行、Export2Excel 自动换行
  11. 电视剧《赘婿》宁毅与乌家的岁布战没怎么看懂,可以细致分析一下吗?
  12. centos使用迅雷远程下载
  13. maven profile <filtering>true</filtering>的作用
  14. python安装mysqldb报错
  15. [HTML5-SVG]SVG是什么?SVG有什么用途?
  16. SWUST OJ 954单链表的链接
  17. 你的手指上有几个螺(斗)?指纹决定你的性格
  18. 2020中国卓越管理公司颁奖晚宴成功举办,四家香港科大EMBA校友企业获奖
  19. STM32单片机接直流减速电机编码器注意点
  20. 阿里巴巴与蚂蚁集团开源框架SOFA Boot

热门文章

  1. Delegate如何进行类型转换?
  2. IE中getElementById的Bug
  3. 2010-4-22 星期四 晴转多云
  4. 精选 | 2018年3月R新包推荐
  5. lightgbm algorithm case of kaggle(上)
  6. keytool错误: java.lang.RuntimeException: 用法错误,and 不是合法的命令【转】
  7. maven(一)入门
  8. 重新审视虚拟桌面存储
  9. html5 (个人笔记)
  10. 【转】Linux删除文件未释放空间问题处理