在写博客之前,我有很大疑惑:
同一个进程之间的线程不需要通信啊,访问全局变量就行了,为什么还要有消息队列?
- 全局变量实现线程间通信功能太有限了,举个例子一个生产者线程,一个消费者线程。如果生产的太快,消费者来不及消费怎么办?就有很多消息累积,这时候用队列的方式保存会更好。
- 多线程最关键的是线程同步。如果是个小程序,访问同一个全局变量,当然可以,加个锁就好。但若是大型项目,还是采用消息队列来通信最靠谱。一旦架构变得复杂,多线程就很难控制,采用全局变量往往是不靠谱的,最终你会发现越来越杂乱,管理难度会越来越大,各种锁,多人一起开发的话,动不动就出严重BUG 。所以多线程最好是采用消息队列来通信,结构清晰,模式统一,便于管理,无论你的项目多大,业务量多杂乱,大家都在一套统一的机制下开发,这样做最靠谱。
Python的Queue模块主要方法,我们只需要记住两个,一个是put 放 ,另一个是get 获得,因为我们q = queue.Queue()创建了一个队列后,这个队列是空的,要先放东西进去才能从里面拿东西出来
Queue模块中的常用方法:
- from queue import Queue
- q = Queue(maxsize=100)
- Queue.put() 放入数据 列队满的时候会等待
- Queue.get() 取出数据 列队为空时会等待
- Queue.task_done() put的时候计数 +1 ,get不会 -1, get需要和 task_done 一起使用才会 -1
- Queue.qsize() 返回列队中现存数据的个数
- Queue.empty() 如果队列为空,返回True,反之False
- Queue.full() 如果队列满了,返回True,反之False
- Queue.join() 列队中维持了一个计数,计数不为0时让主线程阻塞等待,列队计数为0时才会继续往后执行
进程queue
"""进程中 列队作为局部变量 需要传参"""
import multiprocessing
def write(q):
for i in range(5): # 列队只能存3个 这里有5个 所以会等q.get()取出数据后 在执行 q.put()存剩下的数据
q.put(i)
print('Put %s in queue. 此时个数:%d' % (i, num))
def read(q):
while not