进程与线程的关系

  1. #!/usr/bin/env python
  2. # -*- coding;utf-8 -*-
  3. """
  4. 多进程(主进程,子进程):
  5. 优点:能同时利用多个CPU,进行多个操作,提高效率。
  6. 缺点:耗费内存资源(进程要开辟内存空间),进程不是越多越好,CPU个数 = 进程个数。
  7. 注意:进程创建内存空间,线程共享内存空间,进程里有全局解释器锁,进程中一次只应许一个线程被处理。
  8. 使用场景:计算密集型适合多进程。
  9. 多线程(主线程,子线程):
  10. 优点:共享内存,IO操作时(不用CPU),创造并发操作(多个操作同时进行),提高效率。
  11. 缺点:抢占资源,请求上下文切换非常耗时(线程处理切换后找到上次处理的地方),线程不是越多越好,视具体案例而定。
  12. 注意:在计算机中,执行任务的最小单元就是线程。
  13. 使用场景:IO密集型适合多线程。
  14. """
  15. """
  16. 使用进程
  17. 1、创建进程
  18. """
  19. import multiprocessing
  20.  
  21. def f1(a1):
  22. print(a1)
  23.  
  24. if __name__ == "__main__":
  25. t1 = multiprocessing.Process(target=f1, args=(11,))
  26. # t1.daemon = True
  27. t1.start()
  28. t1.join(2)
  29. t2 = multiprocessing.Process(target=f1, args=(22,))
  30. # t2.daemon = True
  31. t2.start()

  进程池:

  1. 进程池1

    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 调用Pool进程池模块,创建进程池
    5. """
    6. from multiprocessing import Pool
    7. import time
    8.  
    9. def myfun(i):
    10. time.sleep(2)
    11. return i + 100
    12.  
    13. def end_call(arg):
    14. print("end_all", arg)
    15.  
    16. if __name__ == "__main__":
    17. p = Pool(5)
    18. for i in range(10):
    19. p.apply_async(func=myfun, args=(i,), callback=end_call)
    20. print("end")
    21. p.close()
    22. p.join()
  2. 进程池2
    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. apply与apply_sync的区别
    5. """
    6. from multiprocessing import Pool
    7. import time
    8.  
    9. def f1(a):
    10. time.sleep(1)
    11. print(a)
    12.  
    13. return a
    14.  
    15. def f2(b):
    16. r = "第" + str(b+1) + "个子进程执行完毕"
    17. print(r)
    18.  
    19. if __name__ == "__main__":
    20. pool = Pool(5)
    21. for i in range(10):
    22. # pool.apply(func=f1, args=(i,))
    23. pool.apply_async(func=f1, args=(i,), callback=f2)
    24. """
    25. pool.apply:每个进程之间是串行执行的,排队执行;每一个进程都有一个join()方法
    26. pool.apply_sync:每个进程是并发执行的,并发数取决于进程池,并且可以触发回调函数;每一个进程没有一个join()方法;每一个进程的daemon = True
    27. """
    28. print("主进程执行完毕")
    29. pool.close() # 等所有任务终止再结束,能拿到子进程的结果
    30. # pool.terminate() # 立即终止所有任务,拿不到子进程的结果
    31. pool.join()

进程数据共享:

  1. 进程数据共享1

    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 默认情况下进程数据不共享,要用一个中介数据类型实现进程数据共享
    5. 进程数据共享方式一:
    6. 使用数组,Array使用时必须先定义大小
    7. temp = Array("i",[11,22,33,44]),"i"表示数据类型,数组中的数据类型必须一致
    8. """
    9. from multiprocessing import Process, Value, Array
    10.  
    11. def f(n, a):
    12. n.Value = 3.1415927
    13. for i in range(len(a)):
    14. a[i] = -a[i]
    15.  
    16. if __name__ == "__main__":
    17. num = Value("d", 0.0)
    18. arr = Array("i", range(10))
    19.  
    20. p = Process(target=f, args=(num, arr))
    21. a = Process(target=f, args=(num, arr))
    22. p.start()
    23. a.start()
    24. p.join()
    25. a.join()
    26.  
    27. print(num.value)
    28. print(arr[:])
  2. 进程数据共享2
    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 默认情况下进程数据不共享,要用一个中介数据类型实现进程数据共享
    5. 进程数据共享方式二:
    6. 使用特殊字典
    7. dic = manager.dict()
    8. """
    9. from multiprocessing import Process, Manager
    10.  
    11. def f(d, l):
    12. d[1] = "1"
    13. d["2"] = 2
    14. d[0.25] = None
    15. l.reverse()
    16.  
    17. if __name__ == "__main__":
    18. with Manager() as manager:
    19. d = manager.dict()
    20. l = manager.list(range(10))
    21. p = Process(target=f, args=(d, l))
    22. p.start()
    23. p.join()
    24. print(d)
    25. print(l)
  3. 进程数据不共享
    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 默认情况下进程数据不共享
    5. """
    6. from multiprocessing import Process
    7. li = []
    8.  
    9. def foo(i):
    10. li.append(i)
    11. print("hello", li)
    12.  
    13. if __name__ == "__main__":
    14. for i in range(10):
    15. t = Process(target=foo, args=(i,))
    16. t.start()
  4. 进程字典
    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 进程数据共享方式二:
    5. 使用特殊字典dic = manager.dict()
    6. """
    7. from multiprocessing import Process, Manager
    8.  
    9. def foo(i, dic):
    10. dic[i] = 100 + i
    11. print(len(dic))
    12.  
    13. if __name__ == "__main__":
    14. manage = Manager()
    15. dic = manage.dict()
    16. # dic = dict() 数据无法共享
    17. for i in range(2):
    18. p = Process(target=foo, args=(i, dic))
    19. p.start()
    20. p.join()
  5. 进程数组
    1. #!/usr/bin/env python
    2. # -*- coding;utf-8 -*-
    3. """
    4. 进程数据共享方式一:
    5. 使用数组,Array使用时必须先定义大小
    6. temp = Array("i",[11,22,33,44]),"i"表示数据类型,数组中的数据类型必须一致
    7. """
    8.  
    9. from multiprocessing import Process, Array
    10.  
    11. def foo(i, temp):
    12. print(id(temp))
    13. temp[i] = 100 + i
    14. for item in temp:
    15. print(i, "------>>", item)
    16.  
    17. if __name__ == "__main__":
    18. temp = Array("i", [11, 22, 33, 44])
    19. for i in range(2):
    20. p = Process(target=foo, args=(i, temp))
    21. p.start()
    22. p.join()

      

Python全栈开发:进程代码实例的更多相关文章

  1. python全栈开发 * 进程理论 进程创建 * 180724

    一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...

  2. python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726

    进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...

  3. python全栈开发 * 进程池,线程理论 ,threading模块 * 180727

    一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...

  4. Python全栈开发:递归实例

    #!/usr/bin/env python # -*- coding;utf-8 -*- """ 递归不能无限,python会限制递归深度,递归主要用于费布拉切数列 &q ...

  5. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  6. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  7. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  8. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  9. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  10. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

随机推荐

  1. CommandLineToArgvW调EXE传入参数【转载】

    #include <afxwin.h>  // TODO: add your code here LPWSTR *szArglist = NULL; ; szArglist = Comma ...

  2. NX二次开发-UFUN编辑图层类别描述UF_LAYER_edit_category_descr

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_layer.h> 5 6 7 UF_initialize(); 8 9 //创 ...

  3. 一幅图解决R语言绘制图例的各种问题

    一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...

  4. centos 7 设置IP地址

    先说下安装方式:我是采用的最小化安装 虚拟机软件:vmware 设置IP有两种情况,动态IP和静态IP,下面分别说明两种IP地址的设置方法 1.动态IP 条件:路由设置了动态分配IP地址(一般默认是动 ...

  5. socket的多线程实现

    步骤: 1.服务端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建socket并请求与服务端对话: 3.服务端接收客户端的请求,创建socket与客户端进行专线连 ...

  6. python初探爬虫

    python爬虫初探 爬取前50名豆瓣电影: 废话少说,直接上代码! import re​import requestsfrom bs4 import BeautifulSoup​def get_co ...

  7. 2018北京网络赛 G The Mole /// 分块暴力 点线距离

    题目大意: 给定n段线段 编号为1~n 接下来m个询问 给定一点 输出离该点最近的线段的最小编号(距离相等时取编号小的) 题解 大致就是 1.坐标范围为(0,2^16-1) 将坐标系划分为2^8*2^ ...

  8. Spring MVC @RequestParam(5)

    案例来说明 1 @RequestMapping("user/add") 2 public String add(@RequestParam("name") St ...

  9. 网页开发人员收藏的16款HTML5工具

    本文收集的20款优秀的 HTML5 Web 应用程序,值得添加到您的 HTML5 的工具箱中,他们能够帮助你开发前端项目更快.更容易. Initializr Initializr 是一个可以让你创建 ...

  10. SpringCloud学习笔记《---05 Zuul---》基础篇