线程:线程中主线程可以直接写数据到全局变量
进程:进程则通过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模块