• 并发编程中使用到的模块,相关总结


    并发编程中使用到的模块:

    多进程:


    multiprocessing包 

      开启进程:multiprocessing.Process, (from multiprocessing import Process)

      进程池:multiprocessing.Pool,  (requests,from urllib.request import urlopen 爬虫有用到)

      进程间同步控制:multiprocessing.Lock  multiprocessing.Semaphore  multiprocessing.Event

      进程间通信:multiprocessing.Queue  multiprocessing.Pipe

      进程间数据共享:multiprocessing.Manager  

                

    多线程:


    threading包:

      threading.Thread

      threading.Lock

      threading.RLock

      threading.Semaphore,Event

    queue(线程中的队列),注意是普通队列

    线程池(concurrent.futures)

      from concurrent.futures import ThreadPoolExecutor       t = ThreadPoolExecutor(max_workers=5) 

      t.submit(func,i) ##异步开启线程,类似 apply_async   #线程池也不用 target= 了, 但是传参是直接传 不用args=

    协程:


    greenlet模块,gevent模块

    IO模型:


    select模块,selector模块

    IO模型介绍

    异步框架:twisted,tornado

    同步框架:django

    需要开启多进程/线程,并且需要 start()方法的:


      Process(target=,args=()) :RLock,Lock,Semaphore,Event,Queue,Pipe,都要实例化后,把这个实例化传入 args,然后再使用

      Thread(target=,args=()) :RLock,Lock,Semaphore,Event,Condition,都要实例化后,把这个实例化传入 args,然后再使用

    直接开启进程/线程,不用target,不用start方法:


    进程池:开启异步多进程  p = Pool(5), p.apply_async

      Pool.apply_async(func,args,args=(x,y,...),callback=func2) #进程池中不用target=了,直接写函数名,但是传参还是要用args=,回调函数  callback=函数2名字

    线程池:from concurrent.futures import ThreadPoolExecutor       t = ThreadPoolExecutor(max_workers=5) 

      t.submit(func,i) ##异步开启线程,类似 apply_async   #线程池也不用 target= 了, 但是传参是直接传 不用args=

    多线程的定时器,不需要 Thread实例化:

    Timer(2,func).start() #注意,此处Timer是异步不阻塞的,这里的2秒是针对函数来说的,它起了线程后,会马上执行后面的代码

      

    #进程的缺点:
    # 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
    # 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
    
    #   60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,
    # 一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,
    # 可以满足多个运行单位,而多个进程并行开销过大。
    #   因此在80年代,出现了···能独立运行的基本单位——线程(Threads)。
    # ······注意:进程是资源分配的最小单位,线程是CPU调度的最小单位.
    #所以说进程间都有各自的内存空间,只能通信来获取数值
    #      每一个进程中至少有一个线程
    
    #可以把进程看做一个车间,每个进程肯定有一个主线程,类比车间必定有一个工人(主线程)
    #把线程看作车间的工人
    #CPU就是生产零件的机器,工人搬材料给cpu制作。此时如果要多生产零件,我们平时都是在一直增加车间(即增加进程),从而多了工人来运作零件制造
    #但是增加线程,就好比只在一个车间里增加工人,就每必要每次都要新开车间,时空开销这么大了
    
    #在操作系统中的 分时调度系统里,我们所说的切换进程,其实就是切换进程的主线程
    
    #内存中的进程:
    #从头到尾   栈,堆,数据,文本
    
    #进程中有:
    #代码,数据,文件 线程(线程有 寄存器,栈,线程本身)
    # 线程有 寄存器,栈,线程本身
    
    
    # 线程与进程的区别可以归纳为以下4点:
    #   1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
    #   2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
    #   3)调度和切换:线程上下文切换比进程上下文切换要快得多。
                #有时也称做进程切换或任务切换,是指CPU 从一个进程或线程切换到另一个进程或线程。
    #   4)在多线程操作系统中,进程不是一个可执行的实体。
                #真正执行的是线程
    #http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
    
    #线程特点
    #1.轻型实体,占用非常小的资源
    #2.独立调度和分派的基本单位:即cup实际上调度的是线程
    #3.共享进程资源
    #4.可并发执行
    
    
    #协程:
        #本质上是一个线程
        #能够在多个任务之间切换来节省一些IO时间
        #协程中任务之间的切换也消耗时间,但是开销远远小于进程线程之间的切换
    
    #协程的意义:
        #在遇到IO操作的时候,切换到另外一个任务
        #规避之前任务的IO时间,来提高cpu的利用率
        #在实际工作中会采用:进程+线程+协程,来提高代码的并发效果
        #进程是cpu核数+1,线程是cpu核数*5,每个线程中协程最多可以起500个
    #比如:
        #发送了一个网页请求后,在网络延时,等待网页响应的时间(等待IO),就可以用协程去切换任务利用等待的时间,继续发送多个网页请求,从而提高效率
        #进程5,线程20,协程500 = 总共可以有50000个协程:一台4c的机器最多可以接收的并发数
    #数据库,负载均衡,让很多个请求,平均分摊给各个服务器
        #nginx组件 大型互联网公司会用到,就是用来帮你分发任务的,并发最大承载量就是50000,用的就是协程机制
        #一般情况下就是根据这个规则,上下浮动
    线程,进程,协程
     # 主进程
        # 子进程
        # 开启了子进程的主进程 :
            # 主进程自己的代码如果长,等待自己的代码执行结束,
            # 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束
    
    #···子进程不一定要依赖运行着的父进程
    #至于父进程如果关闭了 但是子进程没运行完,
    #比如 控制台 python XXX.py 运行了py文件,此时如果关闭了控制台,py文件是否会跟着关闭?
    #在linux中 如果 python XXX.py &  后面跟上&则 py文件会一直在后台运行
    #所以,关闭父进程,子进程是否关闭要看是怎么规定的
    进程生命周期
    #和进程一样,主线程会等到子线程执行完才结束。 设置守护线程也是 t.daemon=Ture
    #守护进程会随着主进程的结束而结束
    #守护线程会在主线程结束之后等待子线程的结束才结束,主进程只是代码运行结束,但是没关闭,因为主进程要留着内存资源给子线程用
    #但是如果进程既有子线程,也有子进程,会等到所有代码结束完,才结束。因为主进程没结束,所以守护线程还会运行
    线程生命周期
  • 相关阅读:
    form表格属性
    sql查询练习题
    在Mac上搭建java开发环境
    搭建vim作为java开发环境(-)
    C++学习之class
    nginx学习----1
    Html5学习笔记---1
    国庆节
    memcache------01
    jquery学习之概述
  • 原文地址:https://www.cnblogs.com/gkx0731/p/9744204.html
Copyright © 2020-2023  润新知