多进程与多线程学习【附代码】

多进程 

多进程相当于多核处理,可以把任务平均分配给每一个核,并且让他们同时进行
线程是进程的子集,一个进程可以有多个线程组成,多进程的数据是分开的、共享复杂,但同步简单。多线程共享进程的数据,共享简单,但同步复杂

多进程:即正在运行的应用程序,通常称为进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统会给该进程开辟一块空间。
在同一时间里,同一个计算机系统中运行两个或多个进程处于运行状态,这种就说多进程,也称为多任务。
多进程的特点:
    1.数据是分开的,共享复杂,同步简单
    2.占用内存多,切换复杂,cpu利用率低
    3.创建销毁复杂,速度慢
    4.编程简单,调试简单
    5.进程间不会相互影响
    6.适应于多核,多机分布

在python中可以用 from multiprocessing import Process 创建进程。利用os.getpid()获取当前进程的pid,用os.getppid()获取父进程(主进程)的pid。

示例代码如下:

def fnc():
    print("这是一个子进程,进程号: ", os.getpid(), '主进程号: ', os.getppid())

if __name__ == "__main__":
    print("这是一个主进程,进程号: ", os.getpid(), '主进程号(pycharm): ', os.getppid())
    # 实例化一个子进程对象
    obj = Process(target=fnc, name='fnc process')
    obj.start()
    print('执行完成主进程内容')

输出结果为:

这是一个主进程,进程号:  15384 主进程号(pycharm):  17632
执行完成主进程内容
这是一个子进程,进程号:  11880 主进程号:  15384 

首先看到第一行的输出中,主进程pid为15384是当前这个main函数运行时进程的pid[每次运行都不一样],而17632是指我pycharm这个编译软件的进程pid[可以打开任务管理器对照着看]。

接下来是重点!!我们可以看到第二行输出的是执行完主进程内容,但我们看代码这一行是在最后一行呀,按理来说应该是最后输出的。这是因为print("执行完成主进程内容)处于主进程中,因此需要先执行完。obj是创建的子进程,target是需要调用的函数【也就是我们定义的子进程函数】,obj.start()是开始运行子进程,此时才会运行,11880表示的是运行fnc这个函数子进程,而15384就是父进程的pid,这也就说明进程11880是主进程15384的子进程。运行顺序为先父再子。

需要注意一点,在python中Process需要放在if __name__ == "__main__"下面。

上面是先完成主进程,再完成子进程,那么如果想在运行主进程的时候让主进程等待子进程运行完在结束主进程应该怎么做呢?这时可以用到join这个函数,它会将子进程加入到主进程中。让我们来看看效果。

    print("当前主进程pid: ", os.getpid(), "主进程(pycharm)pid: ", os.getppid())
    process_list = []
    t1 = Process(target=fnc, name='process 1')
    t2 = Process(target=fnc, name='process 2')
    process_list.append(t1)
    process_list.append(t2)
    for i in range(len(process_list)):
        process_list[i].start()
    for i in range(len(process_list)):
        process_list[i].join()
    
    print('执行完成主进程内容')

可以得到以下输出:

当前主进程pid:  15320 主进程(pycharm)pid:  13896
这是一个子进程,进程号:  11240 主进程号:  15320
这是一个子进程,进程号:  17852 主进程号:  15320
执行完成主进程内容 

特别注意到,“执行完主进程内容”这句话是最后输出的,而不像上面是最先输出的,这是因为在执行到子进程的时候由于使用了join函数,可以让主进程等待子进程结束后再继续下面的输出,直到主进程的完成。 

多线程

多线程:线程是进程的组成单位,是轻量级的进程,线程是独立的,即一个线程发生异常,不会影响其他线程。它使用共享内存区域。
多线程是一种执行模型,允许多个线程存在于进程的上下文中,以便他们独立执行但共享其进程的资源。
多线程的特点
    1.多线程共享进程数据,共享简单,同步复杂
    2.占用内存少,切换简单,CPU利用率高
    3.创建销毁简单,切换简单,速度快
    4.编程复杂,调试复杂
    5.一个线程挂掉会导致整个进程挂掉
    6.适用于多核分布

需要频繁创建和销毁的优先用线程,需要进行大量计算的优先使用线程【比如图像处理,算法处理】

猜你喜欢

转载自blog.csdn.net/z240626191s/article/details/128950437