multiprocessing模块

multiprocessing模块是Python操作进程的库

示例:

import os
from multiprocessing import Process


def func(arg):
    print("子进程参数:", arg)
    print("当前子进程pid:", os.getpid())


if __name__ == '__main__':
    print("主进程pid:", os.getpid())
    p = Process(target=func, args=('hello', ))
    p.start()

Process()

Process()方法是创建进程的方法,返回一个进程对象
target参数值是一个函数名,表示进程要执行的方法
args参数是一个元组,表示传给要执行的函数里的参数

start()

start()是启动进程的方法

其他方法

join()方法用来产生阻塞,等待进程结束之后,代码才会往下执行

def func():
    print('子进程执行中......')
    time.sleep(5)


if __name__ == '__main__':
    print('------主进程开始------')
    p = Process(target=func)
    print("启动子进程")
    p.start()
    p.join()
    print('子进程执行完毕')
    print('------主进程结束------')
------主进程开始------
启动子进程
子进程执行中......
子进程执行完毕
------主进程结束------


is_alive()方法判断进程是否存活

import time
from multiprocessing import Process


def func():
    print('子进程执行中......')
    time.sleep(5)


if __name__ == '__main__':
    print('------主进程开始------')
    p = Process(target=func)
    print("启动子进程")
    p.start()
    print('子进程执行完毕')
    print('------主进程结束------')
    print('子进程还在码:', p.is_alive())
------主进程开始------
启动子进程
子进程执行完毕
------主进程结束------
子进程还在码: True
子进程执行中......


terminate()方法可以强制结束进程

import time
from multiprocessing import Process


def func():
    print('子进程执行中......')
    time.sleep(5)
    print('子进程执行完毕')


if __name__ == '__main__':
    print('------主进程开始------')
    p = Process(target=func)
    print("启动子进程")
    p.start()
    time.sleep(1)
    p.terminate()
    print('------主进程结束------')
    time.sleep(0.01)
    print('子进程还在码:', p.is_alive())
------主进程开始------
启动子进程
子进程执行中......
------主进程结束------
子进程还在码: False


daemon是一个变量,当设置成True时,子进程会随着主进程的代码结束而结束

import time
from multiprocessing import Process


def func():
    print('子进程执行中......')
    time.sleep(5)
    print('子进程执行完毕')


if __name__ == '__main__':
    print('------主进程开始------')
    p = Process(target=func)
    p.daemon = True
    print("启动子进程")
    p.start()
    print('------主进程结束,子进程也不再执行------')
------主进程开始------
启动子进程
------主进程结束,子进程也不再执行------

使用面向对象的方式开启进程

from multiprocessing import Process


class MyProcess(Process):

    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
        super().__init__()

    def run(self):
        print(self.arg1)
        print(self.arg2)


if __name__ == '__main__':
    mp = MyProcess(arg1='hello', arg2='saiya06')
    mp.start()
hello
saiya06

进程之间的通信Queue

from multiprocessing import Process, Queue


def func(exp, q):
    ret = eval(exp)
    q.put(ret)  # 将计算结果推送到队列中


if __name__ == '__main__':
    q = Queue()  # 定义一个process队列
    Process(target=func, args=('1+2+3', q)).start()  # 开启子进程执行函数func
    res = q.get()  # 获取子进程的计算结果
    print('子进程计算结果:', res)
子进程计算结果: 6
posted @ 2022-12-04 15:42  saiya6  阅读(98)  评论(0)    收藏  举报