python 进程

一、基础知识

1、什么是进程

进程:运行的程序
2、进程和程序的区别
进程:动态
程序:静态
3、进程的状态
Ready Running Blocked
4、进程的生命周期
结束标志
子进程:子进程的代码执行结束
主进程:主进程的代码执行结束
子进程的主进程:子进程的执行时间大于主进程,子进程执行结束
                           主进程的执行时间大于子进程,主进程执行结束
5、同步/异步/阻塞/非阻塞
同步:串行
异步:并行
阻塞:input time.sleep()等
非阻塞:没有阻塞

二、开启进程

父进程和子进程有独立的内存空间,互不干涉
子进程与子进程之间也各有独立的内存空间,互不干涉

"""
同步
函数和程序的PID一致
"""
import os


def test():
    print('Hello World!')
    print('How are you?')
    print('函数的PID %s' % os.getpid())


test()
print('fine')
print('这个程序的PID %s' % os.getpid())
"""
Hello World!
How are you?
函数的PID 260
fine
这个程序的PID 260
"""
# 异步
# 将函数变成子进程
from multiprocessing import Process


def test():
    print('Hello, World!')
    print('I like money......')


# Windows系统执行进程必要条件
if __name__ == '__main__':
    p = Process(target=test)    # 注册(实例化对象)
    p.start()   # 开启子进程 进程的执行:Ready->Running->Block->Ready
    print('abc')
"""
结果:
abc
Hello, World!
I like money......
"""
# 异步,进程
# 查看进程的子进程
from multiprocessing import Process
import os
import time


def test():
    print('你好')
    print('子进程的PID:%s' % os.getpid())


if __name__ == '__main__':
    p = Process(target=test)
    p.start()
    print('How are you?')
    time.sleep(5)   # 子进程执行完后,再执行下面的语句
    print('父进程的PID:%s' % os.getpid())

"""
结果:
How are you?
你好
子进程的PID:13852
父进程的PID:8180
"""
"""
传递参数
查看子进程,子进程的父进程
查看父进程,父进程的父进程
"""
from multiprocessing import Process
import os


def test(args):
    print('Are you ok? 演唱者: {}'.format(args))
    print('子进程的PID: %s' % os.getpid())
    print('子进程的父进程的PID: %s' % os.getppid())


if __name__ == '__main__':
    p = Process(target=test, args=('雷军', ))     # 传递参数,args=tuple
    p.start()
    print('父进程的PID: %s' % os.getpid())
    print('父进程的父进程: {}'.format(os.getppid()))
"""
结果:
父进程的PID: 13568
父进程的父进程: 3352
Are you ok? 演唱者: 雷军
子进程的PID: 6148
子进程的父进程的PID: 13568
"""

 三、开启多进程

1、创建多个对象

2、使用for循环

# 创建多个子进程
# 子进程之间是异步,互不干扰,都有独立的内存空间
from multiprocessing import Process
import time


def test(args1):
    time.sleep(2)
    print(args1)


def test2(args1):
    print(args1)


if __name__ == '__main__':
    p = Process(target=test, args=('joker', ))
    p.start()
    p1 = Process(target=test2, args=('loss', ))
    p1.start()

"""
结果:
loss
joker
"""
# 使用for循环,创建多个子线程
# 子线程之间是异步,都有独立的内存空间,互不干涉,互不影响
from multiprocessing import Process


def for_fun(args):
    print('*'*args)


if __name__ == '__main__':
    for i in range(1, 5):
        p = Process(target=for_fun, args=(i, ))
        p.start()
"""
结果:
**
*
***
****
"""

四、join()

作用:人为控制,运行完子进程后,运行父进程,把子进程和父进程从异步->同步

import os
from multiprocessing import Process


def test(args1):
    print('Hello {}'.format(args1))
    print('子进程的PID: %s' % os.getpid())
    print('子进程的父进程PID: {}'.format(os.getppid()))


if __name__ == '__main__':
    p = Process(target=test, args=('tom', ))
    p.start()
    p.join()        # join()方法,察觉子进程结束,异步->同步
    print('父进程的PID: %s' % os.getpid())
    print('父进程的父进程PID: {}'.format(os.getppid()))
"""
结果:
Hello tom
子进程的PID: 15772
子进程的父进程PID: 7320
父进程的PID: 7320
父进程的父进程PID: 14600
"""
# 子线程执行完毕后,再执行父线程
# 子线程异步,所有子线程与父线程同步
from multiprocessing import Process


def test(args1):
    print('*'*args1)


li_p = []
if __name__ == '__main__':
    for i in range(1, 5):
        p = Process(target=test, args=(i, ))
        li_p.append(p)
        p.start()
    [i.join() for i in li_p]
    print('+++++++++++++++++++')

 五、面向对象创建进程

"""
1.自定义类,继承Process
2.初始化__init__()方法,并继承父类,目的传递参数
3.run()方法,内部填写子进程执行的代码
4.实例化对象,通过自定义类
"""
import time
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self, args1):
        super(MyProcess, self).__init__()
        self.args1 = args1

    def run(self) -> None:
        print('你好, %s' % self.args1)
        time.sleep(2)
        print('Hello')


if __name__ == '__main__':
    p = MyProcess('tom')
    p.start()
    print('abc')
    # p.join()
    print('只要坚持住,老子天下无敌!!!')
"""
结果:
abc
只要坚持住,老子天下无敌!!!
你好, tom
Hello
"""
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self, args1):
        super(MyProcess, self).__init__()
        self.args1 = args1

    def run(self) -> None:
        print('*'*5*self.args1)


if __name__ == '__main__':
    list_p = []
    for i in range(2, 6):
        p = MyProcess(i)
        list_p.append(p)
        p.start()
    [i.join() for i in list_p]
    print('+++++++++++++++++++++++++++++')
"""
结果:
**********
********************
***************
*************************
+++++++++++++++++++++++++++++
"""

self.pid()  当前进程的PID值

sel.name()  当前进程的名字

from multiprocessing import Process


class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()

    def run(self) -> None:
        print(self.pid)     # 获取该子进程的PID值
        print(self.name)    # 获取该子进程的进程名


if __name__ == '__main__':
    for i in range(3):
        p = MyProcess()
        p.start()

"""
结果:
916
MyProcess-3
4864
MyProcess-1
15140
MyProcess-2
"""
原文地址:https://www.cnblogs.com/wt7018/p/11042642.html