#coding=utf-8
'''
python的多进程的理解。熟悉如何创建一个进程。
以及join,start方法的使用。
来说说我们今天的主角,就是multiprocess模块的使用。该模块在windows上面能够模拟出fork的效果
可以实现跨平台,因此都是用multiprocessing
下面还是来直接看看代码吧。
'''
from multiprocessing import Process
import os
import time
import random
def r1(process_name):
for i in range(5):
print(process_name)
print(os.getpid())
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print(process_name)
print(os.getpid())
time.sleep(random.random())
if __name__=="__main__":
print("main process running.......")
#创建我们的进程。
p1=Process(target=r1,args=("process_name1",))
p2=Process(target=r2,args=("process_name2",))
#通过调用start方法,来启动进程。和线程是差不多的。
p1.start()
p2.start()
#但是run方法在哪里了,我们还没看到
#join方法也很有意思。
p1.join()
p2.join()
print("main process running alll of lines......")
'''
上面的方法提到了两个重要的方法,就是join方法和我们的run方法。
run 在创建process对象的时候,不指定target,那么就会默认执行proces的方法。
'''
#coding=utf-8
'''
还是来看看代码吧。
'''
from multiprocessing import Process
import os
import time
import random
def r():
print(" run method......")
time.sleep(10)
print("hello jack......")
if __name__=="__main__":
print("main process running......")
#没有指定process的target
p1=Process()
p2=Process()
#如果,在创建process的时候,不指定target,
p1.run=r
p2.run=r
p1.start()
p2.start()
p1.join()
p2.join()
print(" main process running all of lines......")
'''
从代码的执行结果可以看到的就是,如果不指定target的话,默认就会执行run方法,如果指定了target
就按照正常的去执行。执行我们的start方法
'''
#coding=utf-8
'''
还有一个方法,就是join方法,在上面的代码里面,在调用process方法的时候,两次调用了join方法,
这个join方法,到底是什么作用了,官方文档给出的意思就是:阻塞当前的进程,直到调用join方法的那个进程执行完毕
在继续执行当前的进程。比如刚下的代码,知识吧join方法注释掉了。
'''
from multiprocessing import Process
import os
import time
import random
def r1(process_name):
for i in range(5):
print(process_name)
print(os.getpid())
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print(process_name)
print(os.getpid())
time.sleep(random.random())
if __name__=="__main__":
print("main process running......")
p1=Process(target=r1,args=("process_name1",))
p2=Process(target=r2,args=("process_name2",))
p1.start()
p2.start()
print("main process runned all lines......")
'''
发现主进程不像之前那样,要等待两个子进程执行完毕才继续执行,而是启动两个进程之后,自己向下
执行。
为了深刻理解这次把P2执行函数的睡眠时间调大一点,让她多睡一会儿,让其保留P1的join。注释掉P2的join
方法,我们来看看效果。
'''
#coding=utf-8
'''
为了深刻理解这次把P2执行函数的睡眠时间调大一点,让她多睡一会儿,让其保留P1的join。注释掉P2的join
方法,我们来看看效果。
'''
from multiprocessing import Process
import os
import time
import random
def r1(process_name):
for i in range(1):
print(process_name)
print(os.getpid()) #打印当前进程的id
time.sleep(random.random())
print("finished1......")
def r2(process_name):
for i in range(1):
print(process_name)
print(os.getpid())
time.sleep(random.random()*2)
print("finished2......")
if __name__=="__main__":
print("main process running......")
p1=Process(target=r1,args=("process_name1",))
p2=Process(target=r2,args=("process_name2",))
p1.start()
p2.start()
p1.join()
#p2.join()
print("main process runned all lines......")
'''
从程序的结果可以很明显的看出,当p1进程调用了join方法之后,主进程会等待P1执行完毕之后,才会
就会向下执行,而不是等待P2执行完毕。
既然这样,为何先要调用start方法,然不是start完成之后,就去调用join了......
'''
#coding=utf-8
'''
'''
from multiprocessing import Process
import os
import time
import random
def r1(process_name):
for i in range(1):
print(process_name)
print(os.getpid()) #打印当前进程的id
time.sleep(random.random())
print("finished1......")
def r2(process_name):
for i in range(1):
print(process_name)
print(os.getpid())
time.sleep(random.random()*2)
print("finished2......")
if __name__=="__main__":
print("main process running......")
p1=Process(target=r1,args=("process_name1",))
p2=Process(target=r2,args=("process_name2",))
p1.start()
p1.join()
p2.start()
#p2.join()
print("main process runned all lines......")
'''
从程序的结果可以很明显的看出,当p1进程调用了join方法之后,主进程会等待P1执行完毕之后,才会
就会向下执行,而不是等待P2执行完毕。
既然这样,为何先要调用start方法,然不是start完成之后,就去调用join了......
从程序的结果可以看出的就是先执行完毕P1,在执行主线程,最后执行完毕p2
join方法是用来阻塞当前线程的,P1.start之后,P1就提示主线程,需要等待P1执行
结束完成之后才会向下执行,那么,主线程就只能等待呗,这样就没有执行P2.start这一句了,
当然,就会变成图示的效果了,
'''
终于把join方法搞清楚了。。。。。哈哈。。。