zoukankan      html  css  js  c++  java
  • 2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块

    1.multiprocessing模块

    • multiprocessing模块就是跨平台版本的多进程模块。
    • multiprocessing模块提供了一个Process类来代表一个进程对象,

      

    2.Process语法结构:

      Process([group [, target [, name [, args [, kwargs]]]]])

    • target:表示这个进程实例所调用对象;

    • args:表示调用对象的位置参数元组;

    • kwargs:表示调用对象的关键字参数字典;

    • name:为当前进程实例的别名;

    • group:大多数情况下用不到;

      Process类常用方法:

    • is_alive():判断进程实例是否还在执行;

    • join([timeout]):是否等待进程实例执行结束,或等待多少秒;

    • start():启动进程实例(创建子进程);

    • run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;

    • terminate():不管任务是否完成,立即终止;

      Process类常用属性:

    • name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;

    • pid:当前进程实例的PID值;

      1) Process(target=test)

    from multiprocessing import Process
    import time
    
    def test():
        while True:
            print("----test1---")
            time.sleep(1)
    
    #Process()  #实例化一个进程
    p = Process(target=test)
    p.start()  #让这个进程开始执行test函数的代码
    
    while True:
        print("----main---")
        time.sleep(1)
    ----main---
    ----test1---
    ----main---
    ----test1---
    ----main---
    ----test1---
    • 该程序等待子进程执行完成才关闭
    • fork创建的子进程,和程序没有关系,随便关闭
    from multiprocessing import Process
    import time
    
    def test():
        for i in range(5):
            print("----test1---")
            time.sleep(1)
    
    p = Process(target=test)
    p.start()  #让这个进程开始执行test函数的代码
    python@ubuntu:~/python06/03-多任务$ python3 13-Process创建的子进程和父进程的关系.py 
    ----test1---
    ----test1---
    ----test1---
    ----test1---
    ----test1---
    python@ubuntu:~/python06/03-多任务$

     

      2)给target函数传递参数

    from multiprocessing import Process
    import os
    
    def test(num):
        print("---pid=%d,ppid=%d,,num=%d"%(os.getpid(),os.getppid(),num))
    
    p = Process(target=test,args=(100,))
    p.start()
    
    print("---main-- pid=%d--"%os.getpid())
    ---main-- pid=2789--
    ---pid=2790,ppid=2789,,num=100

      

      3) join 堵塞

    from multiprocessing import Process
    import os
    import random
    import time
    
    def test():
        for i in range(random.randint(1,5)):
            print("---test--%d"%i)
            time.sleep(1)
    
    p = Process(target=test)
    
    p.start()
    
    p.join() #堵塞  #等待子进程结束,再往下走
    #p.join(1)  #超时时间1s  #关门狗
    
    p.terminate()  #不管任务是否完成,就终止
    
    print("---main-- pid=%d--"%os.getpid())

    2.进程的创建-Process子类

    • 简单工厂模式:父类提供接口,子类自己实现方法
    from multiprocessing import Process
    import time
    
    class MyNewProcess(Process):
        def run(self):        #父类的start()方法调用run方法
            while True:
                print("----1--")
                time.sleep(1)
    
    p = MyNewProcess()
    p.start()              #父类方法有start()
    
    while True:
        print("----main---")
        time.sleep(1)
    ----main---
    ----1--
    ----main---
    ----1--
    ----main---
    ----1--
    • time模块
    In [1]: import time
    
    In [2]: time.ctime()            #格式化时间
    Out[2]: 'Sat Dec  2 17:28:18 2017'
    
    
    In [3]: time.sleep(1)          #休眠1s
    
    
    
    In [4]: time.time()            #linux  1970年到现在多少秒
    Out[4]: 1512206917.624274
    
    
    
    
    ##计算一个程序花费的时间time.time()
    
    In [5]: start_time = time.time()
    
    In [6]: start_time
    Out[6]: 1512206924.3197203
    
    
    In [7]: end_time = time.time()
    
    In [8]: end_time
    Out[8]: 1512206933.599762
    
    In [9]: run_time = end_time - start_time
    
    In [10]: run_time
    Out[10]: 9.280041694641113

       打印进度条

    import time
    for i in range(1,101):
        print("
    %.2f%%"%i, end='')
        time.sleep(0.01)
    
    print("")

        

    3.进程池

    • 上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
    from multiprocessing import Pool
    import os
    import random
    import time
    
    def worker(num):
        for i in range(5):
            print("===pid=%d==num=%d="%(os.getpid(), num))
            time.sleep(1)
    
    #3表示 进程池中对多有3个进程一起执行
    pool = Pool(3)
    
    for i in range(10):
        print("---%d---"%i)
        #向进程池中添加任务
        #注意:如果添加的任务数量超过了 进程池中进程的个数的话,那么不会导致添加不进入
        #       添加到进程中的任务 如果还没有被执行的话,那么此时 他们会等待进程池中的
        #       进程完成一个任务之后,会自动的去用刚刚的那个进程 完成当前的新任务
        pool.apply_async(worker, (i,))
    
    
    pool.close()#关闭进程池,相当于 不能够再次添加新任务了
    pool.join()#主进程 创建/添加 任务后,主进程 默认不会等待进程池中的任务执行完后才结束
                #而是 当主进程的任务做完之后 立马结束,,,如果这个地方没join,会导致
                #进程池中的任务不会执行
    --0---
    ---1---
    ---2---
    ---3---
    ---4---
    ---5---
    ---6---
    ---7---
    ---8---
    ---9---
    ===pid=3036==num=0=
    ===pid=3035==num=1=
    ===pid=3037==num=2=
    ===pid=3037==num=2=
    ===pid=3036==num=0=
    ===pid=3035==num=1=
    ===pid=3036==num=0=
    ===pid=3037==num=2=
    ===pid=3035==num=1=
    ===pid=3037==num=2=
    ===pid=3036==num=0=
    ===pid=3035==num=1=
    ===pid=3036==num=0=
    ===pid=3037==num=2=
    ===pid=3035==num=1=
    ===pid=3035==num=3=
    ===pid=3037==num=4=
    ===pid=3036==num=5=
    ===pid=3035==num=3=
    ===pid=3036==num=5=
    ===pid=3037==num=4=

          

  • 相关阅读:
    为django项目创建虚拟环境
    linux下安装python
    使用scrapy-crawlSpider 爬取tencent 招聘
    linux基础3
    Scrapy
    scrapy-Redis 分布式爬虫
    scrapy-redis(一)
    Linux中文件上传使用rz
    centos 7 安装nginx
    MySQL 5.7 zip 文件安装过程
  • 原文地址:https://www.cnblogs.com/venicid/p/7955127.html
Copyright © 2011-2022 走看看