zoukankan      html  css  js  c++  java
  • 线程池和进程池

    学习任何一门语言,都会接触到线程和进程,多核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来进行下载,进程和线程是比较复杂的,但是有时又非用不可,多多了解还是很有必要的。。。。。

     
  • 相关阅读:
    递归求解的两道小练习
    unittest的前置后置,pytest的fixture和共享机制conftest.py
    pytest + allure
    Jmeter 录制 https协议是出现“您访问的不是安全链接”提示时
    Jmeter
    如何不做登录请求而获取cookie到Jmeter里
    Fiddler抓包后转成jmeter脚本
    Jmeter- 笔记12
    Jmeter- 笔记11
    Jmeter- 笔记10
  • 原文地址:https://www.cnblogs.com/diwangguilai/p/8707111.html
Copyright © 2011-2022 走看看