zoukankan      html  css  js  c++  java
  • 进程的介绍


    1.进程介绍
    进程:一个程序运行起来后,代码+用到的资源称之为进程,他是操作系统分配资源的最小单元
    进程也可以完成多任务。

    2.进程跟线程的区别:
    1.进程不共享全局变量,各自划分出一块内存空间,占用内存资源比较多
    2.线程共享全局变量,占用资源比较少
    3.线程是进程的一部分。

    3.multiprocessing模块
    target 如果传递了函数的引用,可以任务这个子进程就执行这里的代码
    args 给target 指定的函数传递的参数,以元祖的方式传递
    kwargs 给target指定的安徽省农户传递命名参数
    name 给进程设定一个名字,可以不设定
    group 指定进程组,大多数情况下用不到

    Process 创建的实例对象的常用方法:
    start() 启动子进程
    is_alive() 判断子进程是否还活着
    join() 是否等待子进程执行结束,或等待多少秒
    terminate() 不管任务是否完成,立即终止子进程

    Process 创建的实例对象的常用属性:
    name 当前进程的别名
    pid 当前进程的pid

    4.进程间通信 - Queue
    multiprocessing.Queue()和queue.Queue()区别
    1.queue.Queue()是进程内阻塞队列
    2.multiprocessing.Queue()是跨进程通信队列
    3.多进程前者是各自私有,后者是各自进程共有
    4.Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信

    例子:
    from multiprocessing import Process,Queue

    def work1(q):
    while q.qsize()>0:
    print(q.get())

    def work2(q):
    while q.qsize()>0:
    print(q.get())

    if __name__ == '__main__':
    注意:队列要在下面创建,如果在上面闯将将不能共享全局变量。
    q = Queue()
    for i in range(10):
    q.put("http://www.baidu.com")

    p = Process(target=work1,args=(q,))
    p1 = Process(target=work2, args=(q,))

    p.start()
    p1.start()

    5.进程池子
    初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池
    还没满,那么久创建一个新的进程用来执行该请求;但是如果池中的进程数已经达到指定的最大值
    那么请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

    pool 常用方法

    apply_async() 使用非租塞方式调用func
    close() 关闭pool
    terminate() 不管任务是否完成立即终止
    join() 主进程阻塞,等待子进程的退出,必须在close或terminate之后使用

    例子:

    import os
    import time
    from multiprocessing import Process,Queue,Manager,Pool

    def work1():
      print("进程池---{}".format(os.getpid()))
      time.sleep(1)

    if __name__ == '__main__':
    p = Pool(3)
    for i in range(10):
      p.apply_async(work1)

    p.close()
    p.join()

    6.进程池中的queue
    如果使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue()

    例子:
    import os
    import time
    from multiprocessing import Pool,Manager


    def work1(q):
      print("进程池---{}".format(os.getpid()))
      print(q.get())
      time.sleep(1)

    if __name__ == '__main__':
    Manager()
    q = Manager().Queue()
    for i in range(10):
      q.put("你好啊")

    p = Pool(3)
    for i in range(10):
      p.apply_async(work1)

    p.close()
    p.join()

  • 相关阅读:
    MyBatis 3源码分析
    Java动态代理
    HashMap原理分析(JDK1.7.x之前)
    JQuery datepicker 用法
    百度一键分享功能
    JQuery BlockUI插件
    AJAX参数详解
    ECharts图标库
    KeCode对照表(键盘按键的获取)
    常见浏览器兼容问题
  • 原文地址:https://www.cnblogs.com/666666pingzi/p/10993949.html
Copyright © 2011-2022 走看看