python基础学习3

多任务:

frok():只能在linux下执行

import os
import time

#在程序运行时,父进程的ID就已经生成完毕了
print('当前进程是父进程,id是:%s'%os.getpid())

ret = os.fork()   #创建一个子进程
#ret的值在父进程中是子进程的ID,在子进程中则返回0
print('ret的值是%s'%ret)

print('*'*50)

if ret == 0:        #ret值为0,是子进程
    print('这是一个子进程:%s,他的父进程是:%s'%(os.getpid(),os.getppid()))
    time.sleep(1)

#os.getpid()是返回当前进程id,os.getppid()是返回当前进程的父进程id

elif ret > 0:          #ret值大于0,是在父进程中
    print('这是父进程:%s,子进程的值是:%s'%(os.getpid(),ret))
    time.sleep(1)
else:
    print('进程创建失败')
    time.sleep(1)

如果主进程退出,整个进程就直接退出了,不会因为子进程没执行完而等待子进程结束后才结束整个进程

子进程中修改的全局变量不会影响到父进程的全局变量,多进程中,数据不共享,如果想共享进程中的数据,需要进程间通信


 多次fork()的结果:


父进程,子进程执行顺序没有规律,完全看操作系统的调度代码


multiprocessing 在windows上也能用的多进程模块,他提供了一个Process类来代表一个进程对象,这样就能实现跨平台开发了

fork()创建的子进程,如果主进程退出,就所有进程退出

Process类创建的子进程,主进程退出后还会继续执行

from multiprocessing import Process
import os
import time

#将子进程要执行的代码放入函数中
def run_proc(name):
    print('子进程运行中,name = %s , pid = %d...'%(name,os.getpid()))

if __name__ == '__main__':
    print('父进程%d'%os.getpid())

    #创建一个Process的实例对象,一个实例对象就是一个子进程
    p = Process(target=run_proc,args=('test',)) #传入的是元组,如果只有一个值,要在结尾加逗号
                    #target后面放的是子进程要运行的函数
                    #args放的是target里函数需要的参数
    
    print('子进程开始执行')
    p.start()   #开始执行子进程
    p.join()    #等待子进程结束后才继续执行后面的函数,通常用于进程同步
    print('子进程结束执行')

实例练习:

from multiprocessing import Process
import os
import time

#将子进程要执行的代码放入函数中
def run_proc(name,age,**kwargs):
    for i in range(10):
        print('子进程运行中,name = %s,age=%d,pid = %d...'%(name,age,os.getpid()))
        print(kwargs)
        time.sleep(1)
    print('子进程结束')


if __name__ == '__main__':
    p = Process(target=run_proc,args=('test',18),kwargs={'tom':'alice'})
    print('子进程将要执行')
    p.start()
    
    time.sleep(1)
    p.terminate()    #杀死子进程
    
    p.join()
    print('父进程结束')

发现子进程就运行了一秒后就被强行结束了,结束后执行输出父进程结束,如果没有调用terminate()的话,会等到子进程循环完才结束


实例练习2:

from multiprocessing import Process
import os
import time

def work_1(interval):
    print('work_1父进程(%s),当前进程(%s)'%(os.getppid(),os.getpid()))
    
    t_start = time.time()  #取当前的时间戳
    time.sleep(interval)
    t_end = time.time()
    print('work_1 执行时间为%.2f秒'%(t_end-t_start))
    print('work_1结束')


def work_2(interval):
    print('work_2父进程(%s),当前进程(%s)'%(os.getppid(),os.getpid()))
    
    t_start = time.time()  #取当前的时间戳
    time.sleep(interval)
    t_end = time.time()
    print('work_2 执行时间为%.2f秒'%(t_end-t_start))
    print('work_2结束')

if __name__ == '__main__':
    print('当前程序ID(父进程):%s'%os.getpid())
    
    p1 = Process(target=work_1,args=(2,))
    p2 = Process(target=work_2,name='dd',args=(3,))
    #name参数是给进程取个进程名,没有调用的话程序会默认生成Process-x的程序名

    p1.start()
    p2.start()

    print('p1.name=%s'%p1.name)
    print('p1.pid=%d'%p1.pid)
    print('p2.name=%s'%p2.name)
    print('p2.pid=%d'%p2.pid)

    print('主进程结束')

 

猜你喜欢

转载自www.cnblogs.com/GetAlice/p/9389861.html
今日推荐