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\n" print ("process_one work time is {0}\n".format(time.ctime())) print "end process_one\n" def process_two(interval): time.sleep(interval) print "start process_two\n" print ("process_two work time is {0}\n".format(time.ctime())) print "end process_two\n" def process_three(interval): time.sleep(interval) print "start process_three\n" print ("process_three work time is {0}\n".format(time.ctime())) print "end process_three\n" 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())+"\n" for p in multiprocessing.active_children(): print "child p.name "+p.name+"\np.id "+ str(p.pid)+"\n" 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) 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) 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
温馨提示:上次调试程序的时候出现一个问题,原因是局部变量的名字与本文件中的一个函数名相同了,导致程序运行失败