本文主要讲述python使用 multiprocessing 实现多进程

 

先定义一个受害者函数

import datetime
import multiprocessing
import time
import os


def work(worker='哥哥' , stime=3):
    print(worker , '开始工作' , str(datetime.datetime.now())[:-7] , '当前进程的编号' , os.getpid() , '父进程的编号' , os.getppid())
    time.sleep(stime)
    print(worker , '结束工作' , str(datetime.datetime.now())[:-7])

 

 

普通写法

if __name__ == '__main__':
    # 1
  work('小红')
  work('黑粉')
  work('哥哥')

结果

    # 小红 开始工作 2023-03-31 10:11:36 当前进程的编号 88052 父进程的编号 13320
    # 小红 结束工作 2023-03-31 10:11:39
    # 黑粉 开始工作 2023-03-31 10:11:39 当前进程的编号 88052 父进程的编号 13320
    # 黑粉 结束工作 2023-03-31 10:11:42
    # 哥哥 开始工作 2023-03-31 10:11:42 当前进程的编号 88052 父进程的编号 13320
    # 哥哥 结束工作 2023-03-31 10:11:45

可以看到函数是依次执行的 

 

多进程写法

if __name__ == '__main__':
    # 2
    xiaohong = multiprocessing.Process(target=work , args=('小红' ,))
    heifen = multiprocessing.Process(target=work , kwargs={'worker': '黑粉'})
    gege = multiprocessing.Process(target=work)
    xiaohong.start()
    heifen.start()
    gege.start()
    time.sleep(1)
print('老板溜了',str(datetime.datetime.now())[:-7] )
 

输出

    # 小红 开始工作 2023-03-31 10:13:54 当前进程的编号 51404 父进程的编号 60648
    # 黑粉 开始工作 2023-03-31 10:13:54 当前进程的编号 41040 父进程的编号 60648
    # 哥哥 开始工作 2023-03-31 10:13:54 当前进程的编号 113232 父进程的编号 60648
    # 老板溜了 2023-03-31 10:13:55
    # 小红 结束工作 2023-03-31 10:13:57
    # 黑粉 结束工作 2023-03-31 10:13:57
    # 哥哥 结束工作 2023-03-31 10:13:57

这个时候三个人就是同时工作的,子进程不一样 ,父进程一样

但是父进程结束后,子进程不受影响   ()

 

 

守护进程

设置子进程守护,当主进程结束时,子进程也不再继续执行,直接结束。
进程名称.daemon = True
if __name__ == '__main__':
    xiaohong = multiprocessing.Process(target=work , args=('小红' , 3))
    heifen = multiprocessing.Process(target=work , kwargs={'worker': '黑粉' , 'stime': 3})
    gege = multiprocessing.Process(target=work)
    xiaohong.daemon = True
    heifen.daemon = True
    xiaohong.start()
    heifen.start()
    gege.start()
    time.sleep(1)
    print('老板溜了' , str(datetime.datetime.now())[:-7])

输出

    # 小红 开始工作 2023-03-31 10:16:39 当前进程的编号 46800 父进程的编号 111792
    # 黑粉 开始工作 2023-03-31 10:16:39 当前进程的编号 49532 父进程的编号 111792
    # 哥哥 开始工作 2023-03-31 10:16:39 当前进程的编号 20516 父进程的编号 111792
    # 老板溜了 2023-03-31 10:16:40
    # 哥哥 结束工作 2023-03-31 10:16:42

因为哥哥不是守护进程  所以父进程结束后 哥哥会继续执行  也只有哥哥会继续执行

 


join

让父进程等待子进程执行完再执行

if __name__ == '__main__':
    xiaohong = multiprocessing.Process(target=work , args=('小红' , 3))
    heifen = multiprocessing.Process(target=work , kwargs={'worker': '黑粉' , 'stime': 5})
    gege = multiprocessing.Process(target=work)
    xiaohong.daemon = True
    xiaohong.start()
    heifen.start()
    gege.start()
    gege.join()
    print('老板溜了' , str(datetime.datetime.now())[:-7])

输出

小红 开始工作 2023-03-31 10:44:39 当前进程的编号 56624 父进程的编号 21948
黑粉 开始工作 2023-03-31 10:44:39 当前进程的编号 20668 父进程的编号 21948
哥哥 开始工作 2023-03-31 10:44:39 当前进程的编号 100428 父进程的编号 21948
哥哥 结束工作 2023-03-31 10:44:41
老板溜了 2023-03-31 10:44:41
黑粉 结束工作 2023-03-31 10:44:44

很明显 老板是等哥哥结束工作才走的   而小红作为守护进程  在父进程结束它也直接结束了

 

 posted on 2023-03-31 10:34  宁青楼  阅读(13)  评论(0)    收藏  举报