加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python多进程之join方法深度解析

(2018-08-16 07:15:41)
标签:

python

it

分类: python基础
#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方法搞清楚了。。。。。哈哈。。。
    
    

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有