python 消息队列 地址_Python消息队列-阿里云开发者社区

消息中间件 --->就是消息队列

异步方式:不需要立马得到结果,需要排队

同步方式:需要实时获得数据,坚决不能排队

例子:

#多进程模块multiprocessing

from multiprocessing import Process

from multiprocessing import Queue

def write(q):

for i in ["a", "b", "c", "d"]:

q.put(i)

print ("put {0} to queue".format(i))

def read(q):

while 1:

result = q.get()

print ("get {0} from queue".format(result))

#写一个主函数

def main():

q = Queue()

pw = Process(target=write, args=(q,))

pr = Process(target=read, args=(q,))

pw.start()

pr.start()

pw.join()

#终止pr线程

pr.terminate()

if __name__ == '__main__':

#调用主函数

main()

输出:

put a to queue

put b to queue

put c to queue

put d to queue

多进程模块multiprocessing中pipe方法实现消息队列

例子:

from multiprocessing import Pipe, Process

import time

def proce1(pipe):

for i in xrange(1, 10):

pipe.send(i)

print ("send {0} to pipe".format(i))

time.sleep(1)

def proce2(pipe):

n = 9

while n > 0 :

result = pipe.recv()

print ("recv {0} from pipe".format(result))

def main():

pipe = Pipe(duplex=False)

print (type(pipe))

p1 = Process(target=proce1, args=(pipe[1],))

p2 = Process(target=proce2, args=(pipe[0],))

p1.start()

p2.start()

p1.join()

p2.join()

pipe[0].close()

pipe[1].close()

if __name__ == '__main__':

main()

输出:

send 1 to pipe

recv 1 from pipe

recv 2 from pipe

send 2 to pipe

recv 3 from pipe

send 3 to pipe

recv 4 from pipe

send 4 to pipe

send 5 to pipe

recv 5 from pipe

recv 6 from pipe

send 6 to pipe

send 7 to pipe

recv 7 from pipe

send 8 to pipe

recv 8 from pipe

send 9 to pipe

recv 9 from pipe

模仿生产者和消费者的多线程消息队列练习

例子:

from threading import Thread

from multiprocessing import Queue

import time

class Proceduer(Thread):

def __init__(self, queue):

super(Proceduer, self).__init__()

self.queue = queue

def run(self):

try:

for i in xrange(1, 10):

print ("put data is {0} to queue".format(i))

self.queue.put(i)

except Exception as e:

print ("put data error")

raise e

class Consumer_odd(Thread):

def __init__(self, queue):

super(Consumer_odd, self).__init__()

self.queue = queue

def run(self):

try:

while not self.queue.empty:

number = self.queue.get()

if number%2 != 0:

print ("get {0} from queue odd. thread name is {1}".format(number, self.getName()))

else:

self.queue.put(number)

time.sleep(1)

except Exception as e:

raise e

class Consumer_even(Thread):

def __init__(self, queue):

super(Consumer_even, self).__init__()

self.queue = queue

def run(self):

try:

while not self.queue.empty:

number = self.queue.get()

if number%2 == 0:

print ("get {0} from queue even.thread name is{1}".format(number, self.getName()))

else:

self.queue.put(number)

time.sleep(1)

except Exception as e:

raise e

def main():

queue = Queue()

p = Proceduer(queue=queue)

p.start()

p.join()

time.sleep(1)

c1 = Consumer_odd(queue=queue)

c2 = Consumer_even(queue=queue)

c1.start()

c2.start()

c1.join()

c2.join()

print ("ALL thread terminate")

if __name__ == '__main__':

main()

本文转自 粗粮面包 51CTO博客,原文链接:http://blog.51cto.com/culiangmianbao/2051917,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值