zoukankan      html  css  js  c++  java
  • Python的多进程编程

    考虑到多线程,都在一个主进程中共享栈变量,在操作同一个局部变量时可能出现絮乱的现象,即使加锁也容易出现死锁的现象,小编在这里再次记录下多进程编程,废话不多说,直接上代码:

    #!/usr/bin/env python    
    #encoding: utf-8  
    
    import multiprocessing
    import time
    
    def process_one(interval):
        n =5
        while n >0:
            print ("the time is {0}".format(time.ctime()))
            time.sleep(interval)
            n -= 1
    
    if __name__=="__main__":
        process_test = multiprocessing.Process(target = process_one,args = (2,))
        process_test.start()
        print "process_test.pid:", process_test.pid
        print "process_test.name:",process_test.name
        print "process_test.is_alive",process_test.is_alive()

    在命令行运行结果:

    C:Python27>python mul_process.py
    process_test.pid: 88492
    process_test.name: Process-1
    process_test.is_alive True
    the time is Sun Jul 16 19:38:24 2017
    the time is Sun Jul 16 19:38:26 2017
    the time is Sun Jul 16 19:38:28 2017
    the time is Sun Jul 16 19:38:30 2017
    the time is Sun Jul 16 19:38:32 2017

    同时开启3个进程:

    #!/usr/bin/env python    
    #encoding: utf-8  
    
    import multiprocessing
    import time
    
    def process_one(interval):
        time.sleep(interval)
        print "start process_one
    "
        print ("process_one work time is {0}
    ".format(time.ctime()))
        print "end process_one
    "
    
    def process_two(interval):
        time.sleep(interval)
        print "start process_two
    "
        print ("process_two work time is {0}
    ".format(time.ctime()))
        print "end process_two
    "
    
    def process_three(interval):
        time.sleep(interval)
        print "start process_three
    "
        print ("process_three work time is {0}
    ".format(time.ctime()))
        print "end process_three
    "
    
    if __name__=="__main__":
        process_test_1 = multiprocessing.Process(target = process_one,args = (1,))
        process_test_2 = multiprocessing.Process(target = process_two,args = (2,))
        process_test_3 = multiprocessing.Process(target = process_three,args = (3,))
    
        process_test_1.start()
        process_test_2.start()
        process_test_3.start()
    
        
        
        print "the number of CPU is :"+str(multiprocessing.cpu_count())+"
    "
        for p in multiprocessing.active_children():
            print "child p.name "+p.name+"
    p.id "+ str(p.pid)+"
    "
        print "end!!!!!!!!!!!!!!"

    运行结果:

    C:Python27>python mul_process.py
    the number of CPU is :2
    
    child p.name Process-3
    p.id 101572
    
    child p.name Process-2
    p.id 101420
    
    child p.name Process-1
    p.id 99852
    
    end!!!!!!!!!!!!!!
    start process_one
    
    process_one work time is Sun Jul 16 20:05:07 2017
    
    end process_one
    
    start process_two
    
    process_two work time is Sun Jul 16 20:05:08 2017
    
    end process_two
    
    start process_three
    
    process_three work time is Sun Jul 16 20:05:09 2017
    
    end process_three

    将进程封装为类:

    #!/usr/bin/env python    
    #encoding: utf-8  
    
    import multiprocessing
    import time
    
    class ClockProcess(multiprocessing.Process):
        def __init__(self,interval):
            multiprocessing.Process.__init__(self)
            self.interval = interval
    
        def run(self):
            n=5
            while n>0:
                print "the time is {0}".format(time.ctime())
                time.sleep(self.interval)
                n -= 1
                
    if __name__=="__main__":
        process_test_1 = ClockProcess(2)
        process_test_1.start()
        

    温馨提示:进程p调用start()时,自动调用run()

    运行结果:

    C:Python27>python mul_process.py
    the time is Sun Jul 16 20:11:59 2017
    the time is Sun Jul 16 20:12:01 2017
    the time is Sun Jul 16 20:12:03 2017
    the time is Sun Jul 16 20:12:05 2017
    the time is Sun Jul 16 20:12:07 2017

    探究daemon程序对比结果

    #!/usr/bin/env python    
    #encoding: utf-8  
    
    import multiprocessing
    import time
    
    def process_one(interval):
        print "process_one start time :{0}".format(time.ctime())
        time.sleep(interval)
        print "process_one end time :{0}".format(time.ctime())
    
    if __name__=="__main__":
        process_test = multiprocessing.Process(target = process_one,args = (2,))
        process_test.daemon = True
        process_test.start()
        print "end!!!!!!!!!!!!!!!"

    执行结果:

    C:Python27>python mul_process.py
    end!!!!!!!!!!!!!!!

    怎么回事???开启的进程怎么没有运行?

    :因子进程设置了daemon属性,主进程结束,它们就随着结束了

    #!/usr/bin/env python    
    #encoding: utf-8  
    
    import multiprocessing
    import time
    
    def process_one(interval):
        print "process_one start time :{0}".format(time.ctime())
        time.sleep(interval)
        print "process_one end time :{0}".format(time.ctime())
    
    if __name__=="__main__":
        process_test = multiprocessing.Process(target = process_one,args = (2,))
        process_test.daemon = True
        process_test.start()
        process_test.join()
        print "end!!!!!!!!!!!!!!!"

    运行结果:

    提示这里跟多线程相似

    C:Python27>python mul_process.py
    process_one start time :Sun Jul 16 20:21:34 2017
    process_one end time :Sun Jul 16 20:21:36 2017
    end!!!!!!!!!!!!!!!

    import multiprocessing
    import time
    
    def process_with_lock(lock,file):
        with lock:
            fo = open(file,'a+')
            n= 5
            while n>1:
                fo.write("Lockd acquired via with %d
    "% n)
                n -= 1
            fo.close()
    
    def process_without_lock(lock,file):
        lock.acquire()
        try:
            fo = open(file,'a+')
            n= 5
            while n>1:
                fo.write("Lock acquired via directly %d
    "% n)
                n -= 1
            fo.close()
        finally:
            lock.release()
    
    
    
    if __name__=="__main__":
        lock = multiprocessing.Lock()
        file_test = "file.txt"
        process_with = multiprocessing.Process(target = process_with_lock,args = (lock,file_test))
        process_without = multiprocessing.Process(target = process_without_lock,args = (lock,file_test))
        process_with.daemon=True
        process_without.daemon=True
        process_with.start()
        process_without.start()
        process_with.join()
        process_without.join()
        print "end!!!!!!!!!!!!!!!"

    文件的输出:

    Lockd acquired via with 5
    Lockd acquired via with 4
    Lockd acquired via with 3
    Lockd acquired via with 2
    Lock acquired via directly 5
    Lock acquired via directly 4
    Lock acquired via directly 3
    Lock acquired via directly 2

    温馨提示:上次调试程序的时候出现一个问题,原因是局部变量的名字与本文件中的一个函数名相同了,导致程序运行失败

  • 相关阅读:
    iOS OC语言: Block底层实现原理 (转载)
    Objective-C中的Block(闭包) (轉載)
    http://oncenote.com/2015/09/16/Security-2-HTTPS2/ (轉載)
    iOS安全系列之一:HTTPS (轉載)
    Swif基本语法以及与OC比较三
    OC/Swift第三方添加出错解决方法
    Swift基本语法及与OC比较之二
    2015AppStore 上传步骤及常见问题
    使用AJAX日历控件,显示某些日期(CalendarExtender)
    在CheckBox中,仅仅允许选择一项
  • 原文地址:https://www.cnblogs.com/wc554303896/p/7191777.html
Copyright © 2011-2022 走看看