协程

 

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

进程:进程则通过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模块 

 

原文地址:https://www.cnblogs.com/Vera-y/p/10050254.html