进程与线程的关系

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

  进程池:

  1. 进程池1

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

进程数据共享:

  1. 进程数据共享1

    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    默认情况下进程数据不共享,要用一个中介数据类型实现进程数据共享
    进程数据共享方式一:
    使用数组,Array使用时必须先定义大小
    temp = Array("i",[11,22,33,44]),"i"表示数据类型,数组中的数据类型必须一致
    """
    from multiprocessing import Process, Value, Array def f(n, a):
    n.Value = 3.1415927
    for i in range(len(a)):
    a[i] = -a[i] if __name__ == "__main__":
    num = Value("d", 0.0)
    arr = Array("i", range(10)) p = Process(target=f, args=(num, arr))
    a = Process(target=f, args=(num, arr))
    p.start()
    a.start()
    p.join()
    a.join() print(num.value)
    print(arr[:])
  2. 进程数据共享2
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    默认情况下进程数据不共享,要用一个中介数据类型实现进程数据共享
    进程数据共享方式二:
    使用特殊字典
    dic = manager.dict()
    """
    from multiprocessing import Process, Manager def f(d, l):
    d[1] = "1"
    d["2"] = 2
    d[0.25] = None
    l.reverse() if __name__ == "__main__":
    with Manager() as manager:
    d = manager.dict()
    l = manager.list(range(10))
    p = Process(target=f, args=(d, l))
    p.start()
    p.join()
    print(d)
    print(l)
  3. 进程数据不共享
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    默认情况下进程数据不共享
    """
    from multiprocessing import Process
    li = [] def foo(i):
    li.append(i)
    print("hello", li) if __name__ == "__main__":
    for i in range(10):
    t = Process(target=foo, args=(i,))
    t.start()
  4. 进程字典
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    进程数据共享方式二:
    使用特殊字典dic = manager.dict()
    """
    from multiprocessing import Process, Manager def foo(i, dic):
    dic[i] = 100 + i
    print(len(dic)) if __name__ == "__main__":
    manage = Manager()
    dic = manage.dict()
    # dic = dict() 数据无法共享
    for i in range(2):
    p = Process(target=foo, args=(i, dic))
    p.start()
    p.join()
  5. 进程数组
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    进程数据共享方式一:
    使用数组,Array使用时必须先定义大小
    temp = Array("i",[11,22,33,44]),"i"表示数据类型,数组中的数据类型必须一致
    """ from multiprocessing import Process, Array def foo(i, temp):
    print(id(temp))
    temp[i] = 100 + i
    for item in temp:
    print(i, "------>>", item) if __name__ == "__main__":
    temp = Array("i", [11, 22, 33, 44])
    for i in range(2):
    p = Process(target=foo, args=(i, temp))
    p.start()
    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. NX二次开发-UFUN拾取向量对话框UF_UI_specify_vector

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //拾取向量对话框 ], pnt[]; int mode = UF_UI ...

  2. 编译器报错: error LNK2001: unresolved external symbol "struct _ServiceDescriptorTable * KeServiceDescript

    转自VC错误:http://www.vcerror.com/?p=10 问题描述: 编译器报错: error LNK2001: unresolved external symbol "str ...

  3. 数据结构C++版-树

    一.概念 树是节点的有限集合. 二叉树: 二.补充知识点 1.<二叉树编码实战二>课程笔记: 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 迭代:利用变量的原值推算 ...

  4. topjui.common.js

    function getTabWindow() { var curTabWin = null; if (topJUI.config.aloneUse) { curTabWin = window; } ...

  5. 剑指offer——02二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  6. js 关闭页面(Scripts may close only the windows that were opened by it.)

    传送http://blog.csdn.net/kuangfengbuyi/article/details/52052301 js关闭当前页面,当该页面不是其他页面打开的,而是直接输入url, 直接用w ...

  7. 记录一次MySQL数据库CPU负载异常高的问题

    1.起因 某日下午18:40开始,接收到滕讯云短信报警,显示数据库CPU使用率已超过100%,同时慢查询日志的条数有1500条左右. 正常情况下:CPU使用率为30%-40%之间,慢查询日志条数为0. ...

  8. Web介绍

    web概念概述 javaWeb: 使用java语言开发基于互联网的项目 软件架构: 1.C/S:Client/Server 客户端/服务器端 2.B/S:Browser/Server 浏览器/服务器端 ...

  9. 前端常用的库和实用技术之JavaScript多线程

    多线程概念: 多线程是指从软件或硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在 同一时间执行多于一个线程,进而提升整理处理性能.具有这种能力的系统包括对称多处理机,多核心 ...

  10. marktext常用快捷键使用说明

     快捷键使用 功能 快捷键 备注 X级标题 ctrl+X X∈[1~6] 加粗 Ctrl+B 标题默认加粗 倾斜 Ctrl+I 插入表格 Ctrl+T 侧边文件信息显示 Ctrl+J 删除线 Ctrl ...