python高级编程技巧- 7、8、9 多任务、多线程、多进程、进程池说明

一、任务、线程、进程的区别

a、任务(task): 指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。
b、线程(tread): 线程存在于进程之中,各线程共享相同的代码和全局数据
c、进程(process): 常常被定义为程序的执行、进程是表示资源分配的基本单位,又是调度运行的基本单位,运行的时候,每个进程都会复制主代码独自运行,主进程随子进程的结束最后结束

注:
1、线程存在于进程中,各线程之间可以共用全局变量 及调用其进程中的其他函数
2、进程拥有独立的地址空间资源分配 的基本单位。
3、线程是处理器(cpu) 调度的基本单位
4、任务既可以是线程也可以是进程
5、并发:任务的运行数量与CPU个数一致
6、并行:任务的运行数量小于CPU个数,采取的方式为时间片轮转

所以说程序的运行需要内存和cpu的共同配合

二、多线程详细说明

1、两个进程间遵循时间片轮转,无序,按照CPU调用来执行
2、各线程之间可以共用全局变量
3、IO较多的时候使用
import threading
i=1


def demo1(num):
    global i
    for _ in range(num):
        i=i+1
    print(f'demo1:{i}')


def demo2(num):
    global i
    for _ in range(num):
        i = i + 1
    print(f'demo2:{i}')


def mian():
    num=100000
    t1=threading.Thread(target=demo1,args=(num,))
    t2= threading.Thread(target=demo2,args=(num,))
    t1.start()
    t2.start()


if __name__ == '__main__':
    mian()

运行结果:
demo2:172631
demo1:100001

三、多进程详细说明

1、主进程在所有子进程结束后结束
2、start()创建子进程
3、join()表示该子进程结束后,继续运行主进程
4、is_alive()判断该线程是否存在
5、程序运行较慢的时候使用
import multiprocessing
import time
import os


def demo1():
    t1_start = time.time()
    time.sleep(2)
    print(f'p1:{os.getpid()}')
    t1_end = time.time()
    print(f'demo1_run_time:{t1_end - t1_start}')


def demo2():
    t1_start = time.time()
    time.sleep(5)
    print(f'p2:{os.getpid()}')
    t1_end = time.time()
    print(f'demo2_run_time:{t1_end - t1_start}')


def main():
    p1 = multiprocessing.Process(target=demo1, name='demo1', )
    p2 = multiprocessing.Process(target=demo2, name='demo2')
    p1.start()
    p2.start()
    # print(f'p1_is_alive:{p1.is_alive()}')
    # print(f'p2_is_alive:{p2.is_alive()}')
    p1.join()
    # print(f'p1_is_alive:{p1.is_alive()}')
    # print(f'p2_is_alive:{p2.is_alive()}')


if __name__ == '__main__':
    main()
    print(f'main:{os.getpid()}')

运行结果:
p1:9492
demo1_run_time:2.000339984893799
main:804
p2:4604
demo2_run_time:5.0002968311309814

四、多进程间通信

将demo1进程中的数据丢给demo2进程

import multiprocessing


def demo1(q):
    q.put('test')


def demo2(q):
    print(q.get())


def main():
    q = multiprocessing.Queue(2)
    p1 = multiprocessing.Process(target=demo1, name='demo1', args=(q,))
    p2 = multiprocessing.Process(target=demo2, name='demo2', args=(q,))
    p1.start()
    p2.start()


if __name__ == '__main__':
    main()

显示结果:
test

5、进程池

进程池的作用:当进程过多时,可以采用进程池

import multiprocessing


def demo1(q):
    q.put('test')



def demo2(q):
    print(q.get())



def main():
    p=multiprocessing.Manager().Queue()
    #Pool中执行任务为2个
    po=multiprocessing.Pool(2)
    po.apply_async(demo1,args=(p,))
    po.apply_async(demo2,args=(p,))
    po.close()
    po.join()


if __name__ == '__main__':
    main()

显示结果:
test

猜你喜欢

转载自blog.csdn.net/qq_37697566/article/details/104002391