学习任何一门语言,都会接触到线程和进程,多核CPU提高了我们的工作效率,可以同时处理多任务,比如说你在看电影的时候,爱奇艺进程下就至少要有两个进程,一个用来播放音频,一个用来播放视频。
进程:每个进程都有一份拷贝,因此资源的消耗比较大,但是安全,一个进程崩溃了,不会影响其他进程
线程:一个进程中可以包含若干个线程,多个线程之间共用一份拷贝,但是不安全,一个线程崩溃了,程序就崩溃了。
关于进城和线程的概念就不多说了,来说下进程池和线程池的使用:
什么是进程池?就是把所有的进程都放到一个池子里,让它自己执行其中的进程,直到全部执行完毕,至于如何调度的,那就和操作系统有关了
import multiprocessing
def fun(a):
print(a)
if __name__=='__main__':
print('start....')
p=multiprocessing.Pool(2) #建立一个进程池,该进程池只能同时执行两个进程
p.apply_async(func=fun,args=('bokeyuan',))
p.apply_async(func=fun,args=('bokeyuan1',))
p.apply_async(func=fun,args=('bokeyuan2',))#将进程加入到进程池,一共加入三个,先执行第一个和第二个,等其中一个执行完了,才会执行第三个,开始
p.close()# 关闭进程池,不能再加进程了
p.join() #阻塞主线程
print('end.....')
运行结果如下:
start....
bokeyuan
bokeyuan1
bokeyuan2
end.....
线程池:概念和进程池差不多,用到的threadPool是第三方模块,要自己安装 pip install threadPool
import threadpool #导入第三方模块
def fun(a):
print(a)
print('start...')
p=threadpool.ThreadPool(2) #构造一个只能同时执行两个线程的线程池
reqs=threadpool.makeRequests(fun,args_list=['bokeyuan','bokeyuan1','bokeyuan2']) #产生三个线程,并都放到reqs这个列表中
[p.putRequest(r) for r in reqs] #将线程放到线程池中,开始执行其中的线程
p.wait()#阻塞主线程
print('end....')
运行结果如下:
start...
bokeyuan
bokeyuan1
bokeyuan2
end....
需要指出的是,线程池的函数参数只能是一个,如果有多个的话,要构造出这种形式[([1,2],None),([3,4],None)]
当你需要用到多个进程/线程,但又不想自己调度它们是,进程池/线程池是个不错的选择,我用到的是在tkinter中,主线程是GUI,利用线程池来处理用户输入的内容,比如输入URL来进行下载,进程和线程是比较复杂的,但是有时又非用不可,多多了解还是很有必要的。。。。。