同一进程中的多线程间进行资源共享可以通过全局变量来实现,但是不同的进程使用不同区域的内存,则需要消息队列来通信,不同服务器上的进程想要通信则可以使用redis。
消息队列queue有三张模式:
1、python queue模块的FIFO队列先进先出。
2、LIFO类似于堆先进后出。
3、优先级队列级别越低越先出来。
消息队列的一个好处就是可以降低消息队列的耦合性。
消息队列的创建q = multiprocessing.Queue(n) 其中n为这个消息队列最多可以储存的消息数量
向消息队列中传入消息 q.put() 当队列满时则会阻塞
从消息队列中获取消息 q.get() 当队列为空时则会阻塞 所以可以使用 q.get_nowait() 来获取消息
判断消息队列满或者空则使用q.empty() 和 q.full()
下面是一个列子:
import multiprocessing
# 使用到了消息队列q,所以需要传参
def data_put(q):
# 准备一个列表
list1 = [1, 2, 4, 5, 7, 9]
# 向队列中传消息
for data in list1:
q.put(data)
print("消息已经传完")
def data_get(q):
# 准备一个空列表
get_data = list()
while True:
tmp = q.get()
get_data.append(tmp)
# 取完消息后退出循环
if q.empty():
break
print(get_data)
def main():
# 准备好消息队列
# 两个进程一个传消息,一个拿消息
q = multiprocessing.Queue()
p_put = multiprocessing.Process(target=data_put, args=(q,))
p_get = multiprocessing.Process(target=data_get, args=(q,))
p_put.start()
p_get.start()
if __name__ == "__main__":
main()
运行结果为:
消息已经传完
[1, 2, 4, 5, 7, 9]
另外备注坑点:
由于将文件名字命名为了queue导致在运行queue模块时一直报如下的错误。下次一定注意不要将文件名字取成模块名字!!!!