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

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

原文地址:https://www.cnblogs.com/wc554303896/p/7191777.html