• 进程01


    程序:就是一段代码,么有执行

    进程:以进程为单位来分配系统资源的最小单位,也就是把一段程序执行起来,操作系统会分配一个内存空间,

      里面有代码,有变量,还有程序执行到哪里的计数器等,这就是进程

    单核cpu:如何同时运行qq,微信,酷狗,等多任务?

        这是运用的分时复用的原理,有一个时间片的概念,他是微秒级的,1000微秒=1毫秒,1000毫秒=1秒,

        也就是在一定的时间之内cpu通过时间片来回的切转,让我们人眼看起来就是同时在运行。

    1.直接使用的Process类

    from multiprocessing import Process
    import os

    def run(num):
      print os.getpid(),os.getppid()
      print num

    创建一个子进程对象
    process = Process(target=run, args=(100,), kwargs={})

    process.start()
    process.join()

    2、通过继承Process类来创建进程类,可以重新写一些方法,可以初始化一些参数,以便使用

    from multiprocessing import Process

    from os import getpid


    class SubProcess(Process):
      def __init__(self, num):
        super(SubProcess, self).__init__()  
        self.num = num

      def run(self):
        print 'zijincheng', getpid()
        self.work()

        self.fun()

      def work(self):
        print 'haha'

      def fun():

        pass


    process_object = SubProcess(100)

    process_object.start()   #会自动开启run方法
    process_object.join()

    3、 执行过程

    import os
    import time 

    from multiprocessing import Process

    def sub_process_fun(num, a):

      print os.getpid(),os.getppid()

      # process_obj = Process(target=sub_process_fun, args=(100,), kwargs={"a": 10}, name="itcast")
    process_obj = Process(target=sub_process_fun, args=(100,), kwargs={"a": 10})

    process_obj.start()

    print process_obj.name
    print process_obj.pid      查看子进程pid
    print process_obj.is_alive()

    process_obj.join()         回收子进程,默认是阻塞的

    process_obj.terminate()    停止了子进程,只是停止代码,但是没有进行资源回收,所以下一行is_alive 返回值是true
    print("父进程:子进程的状态 %s" % process_obj.is_alive())
    print("父进程: 回收子进程的资源")


    4、什么是进程池呢?

      当一个主进程执行过程中需要创建子进程来完成多个任务时候,那么如果运用fork来进行创建然后再回收,

        在创建在回收,降低主进程性能。所以事先创建进程池。

      当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,

        手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法

    from multiprocessing import Pool
    import os

    def work():
      print os.getpid()
      print os.getppid()

    po = Pool(3)
    for i in range(3):
      po.apply_async(work,())    后面一个参数是元组形式,(i,)

    #非阻塞方式,就是当执行到这里,主进程for循环执行完了以后
    # 不管子进程是否执行,那么还会继续执行下面的代码
    #apply()阻塞方式

    #关闭进程池,但资源并没有释放
    po.close()
    # 回收进程池资源 主进程阻塞
    po.join()

    life is short,i need python
  • 相关阅读:
    SQl语句学习笔记(二)
    Adaboost 算法
    降维PCA技术
    scanf 格式化字符串详解
    大小端模式和位域详解(转载)
    推荐系统开源软件列表汇总和点评(转载)
    遗传算法入门(转载)
    大白话解析模拟退火算法(转载)
    机器学习相关——协同过滤(转载)
    python面向对象之单例模式
  • 原文地址:https://www.cnblogs.com/lvhonglei-python/p/7483890.html
Copyright © 2020-2023  润新知