python之进程实现(基础)

  • multiprocessing包
    • multiprocess是python中管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块,提供的子模块非常多。
  • Process模块
    • Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
    • 之前我们说过,运行一个py文件就相当于启动了一个进程,这个进程我们成为"主进程"
    • 而在主进程对应的py文件中,可以通过Process模块创建另一个进程,这个进程是基于主进程创建的,因此可以被称为"子进程"
    • 当有了两个进程后,我们其实就可以实现异步机制了!
  • 具体实现过程:
    • 1.导入模块:from multiprocessing import Process
    • 2.基于Process创建一个子进程对象(当前运行的整个py文件表示主进程),然后可以基于target参数将外部的一个函数注册到该子进程中
    • 3.基于start()方法启动创建好的子进程
from multiprocessing import Process
def func():
    print('我是绑定给子进程的一组任务!')

if __name__ == '__main__':
    print('主进程开始执行!')
    #创建一个进程p,给该进程绑定一组任务
    p = Process(target=func)
    #启动创建好的进程
    p.start()
    print('主进程执行结束!')
  • 上面例子,我们通过主进程创建的子进程是异步执行的,那么我们就验证一下,并且看一下子进程和主进程来看看是否是父子关系。
    • os.getpid() 获取自己进程的ID号
    • os.getppid() 获取自己进程的父进程的ID号
import os
from multiprocessing import Process
from time import sleep
def func():
    print('我是子进程!')
    sleep(1)
    print('子进程ID号:',os.getpid())
    print('该子进程的父进程ID号:',os.getppid())

if __name__ == '__main__':
    print('主进程开始执行!主进程的ID号:',os.getpid())
    #创建一个进程p,给该进程绑定一组任务
    p = Process(target=func)
    #启动创建好的进程
    p.start()
    print('主进程执行结束!')
  • 如何手动给注册在子线程中的函数传递指定的参数?通过args传递参数
from multiprocessing import Process
def func(num1,num2):
    print('我是绑定给子进程的一组任务!',num1,num2)

if __name__ == '__main__':
    print('主进程开始执行!')
    #创建一个进程p,给该进程绑定一组任务
    p = Process(target=func,args=(123,456))
    #启动创建好的进程
    p.start()

    print('主进程执行结束!')
  • join方法的使用
    • 观察下面的代码,我们发现每个子进程至少需要2s,而我们统计时间却只花了0.3s左右?
      • 主要原因:主进程先结束、子进程后结束。
import time
from multiprocessing import Process
def get_request(url):
    print('正在请求网址的数据:',url)
    time.sleep(2)
    print('请求结束:',url)

if __name__ == "__main__":
    urls = ['www.1.com','www.2.com','www.3.com']
    for url in urls:
        #创建了三个进程,表示三组任务
        p = Process(target=get_request,args=(url,))
        p.start()
  • join是需要让子进程调用的,主进程一定会等待调用了join的子进程结束后,主进程在结束!
import time
from multiprocessing import Process
def get_request(url):
    print('正在请求网址的数据:',url)
    time.sleep(2)
    print('请求结束:',url)

if __name__ == "__main__":
    start = time.time()

    p_list =  []
    urls = ['www.1.com','www.2.com','www.3.com']
    for url in urls:
        #创建了三个进程,表示三组任务
        p = Process(target=get_request,args=(url,))
        p_list.append(p)
        p.start()

    for i in p_list:   
        i.join()

    print("耗时{}".format(time.time()-start))
  • 进程的类式调用(步骤)
    • 自定义类继承Process
    • 重写父类的run方法
    • 在类外部调用start方法
from multiprocessing import Process

class Myprocess(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    #重写父类中的run方法
    def run(self):
        print("当前{}子进程正在执行".format(self.name))

if __name__ == "__main__":
    p = Myprocess('xwl')
    p.start()
posted @ 2022-05-01 00:05  Tony_xiao  阅读(56)  评论(0编辑  收藏  举报