一、任务、线程、进程的区别
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