• 协程


     

    线程:线程中主线程可以直接写数据到全局变量

    进程:进程则通过callback的回调,父进程获取子进程里的数据(子进程把自己的结果返回给了父进程)

    # queue 里两个子进程同时都往queue里写数据,默认只有一个进程往里面写数据(两个进程间没有影响),两个子进程独立然后和父进程共享数据,
    # Manager 两个进程同时往列表里写东西,可以共同修改一份数据,内存共享,可以互相修改列表里的数据,所有的子进程和父进程数据都是共享的(都不是独立的)

    Manager自身线程安全

    a进程输入字典一个1 , b进程把字典中的1 + 1,(同时修改一份数据)

     

    class queue.Queue(maxsize)# 先进先出, maxsize 指定队列长度

    class queue.LifoQueue() # 后进先出(栈)

    class queue.PriorityQueue() # 存储数据是可设置优先级的队列

          put的时候有两个参数((优先级,数值),timeout=None)(优先级1>10)

    exception queue.Empty    #get()阻塞 ,get_nowait()  非阻塞报此异常

    exception queue.Full   #put()    , put_nowait()   给queue设置长度,满则报异常

    Queue.qsize()  # queue的长度

    Queue.empty()  # 判断queue是否为空

    Queue.full()  #  判断queue是否满了

    Queue.put(item,block = True,timeout = None)  #把数据放入一个队列  ,默认为block,timeout,queue满的时候阻塞了,timeout限定时间,超过时间报异常,否则一直等着

    Queue.put_nowait()  #直接不等,如果满了直接抛异常

    Queue.get()  #拿出数据

    Queue.get_nowait()   #   队列里没有东西,直接抛异常 

    Queue.task_done()    # 队列是一个传送带,生产者,消费者,如一个信号,通知生产者

     

    线程安全的清况下,可以放入实例,对实例进行传输

     

    协程:微线程,纤程,协程是一种用户态的轻量级线程(操作系统不知道它的存在,用户自己孔制)

    拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来时,回复先前的,,

     

    协程能保留上一次调用的状态,每次过程重入时,就相当于进入上次调用的状态

    协程并发也是串行,(两个函数是在一个线程里)协程一定是在单线程里的 

     

    好处:无需线程间的切换开销

        无需原子操作锁定及同步的开销,协程无需加锁,

        方便切换控制流

        高并发,高扩展,低成本

        无法利用多核资源,可以和进程配合

        进行阻塞操作会阻塞掉整个程序(协程的并发是单线程的并发效果,一个blocking会阻塞整个线程),一到i/o操作(操作系统级别的)就进行协程的切换(协程调用读文件时,让文件读到os系统中一个队列里,然后在再切换到其他协程,每一次协程回来读的时候就可以读一点然后切换读一点然后切换,如此往复)

    yeild就是一个简单的协程  

    greenlet模块

    gevent: 封装的greenlet模块 

     

  • 相关阅读:
    [Zjoi2006]GameZ游戏排名系统
    二逼平衡树
    郁闷的小J
    Dynamic Rankings
    数列[专杀Splay版]
    星际争霸
    半平面交
    自适应辛普森
    7月31日
    规约先行-(三)代码格式
  • 原文地址:https://www.cnblogs.com/Vera-y/p/10050254.html
Copyright © 2020-2023  润新知