lua版本:
--生产者,消费者模式--
--通过yield,resume配对实现,类似java的wait和notify
function send(x)
coroutine.yield(x)
end
producer = coroutine.create(function() while true do
local x = io.read()
print("producer get: ",x)
send(x)
end
end)
function receive()
local status,value = coroutine.resume(producer)
--print(status,value)
return value
end
function consumer ()
while(true) do
local x = receive()
if x == "ok" then
print("consumer quit: ",x)
break
else
print("consumer get: ",x)
end
end
end
--consumer()
过程变为:
1,由消费者驱动数据:消费者首先需要一个x,调用receive,此时main coroutine停止running,进入normal状态,
2,此时创建一个coroutine:producer,它有自己的stack,自己的状态,resume后,执行send,发送一个x,此时yield,producer暂停
3, 消费者收到x,继续请求令一个x。
Python版本:
def consumer(): # 定义消费者,由于有yeild关键词,此消费者为一个生成器
print("[Consumer] Init Consumer ......")
r = "init ok" # 初始化返回结果,并在启动消费者时,返回给生产者
while True:
n = yield r # 消费者通过yield接收生产者的消息,同时返给其结果
print("[Consumer] conusme n = %s, r = %s" % (n, r))
r = "consume %s OK" % n # 消费者消费结果,下个循环返回给生产者
def produce(c): # 定义生产者,此时的 c 为一个生成器
print("[Producer] Init Producer ......")
r = c.send(None) # 启动消费者生成器,同时第一次接收返回结果
print("[Producer] Start Consumer, return %s" % r)
n = 0
while n < 5:
n += 1
print("[Producer] While, Producing %s ......" % n)
r = c.send(n) # 向消费者发送消息并准备接收结果。此时会切换到消费者执行
print("[Producer] Consumer return: %s" % r)
c.close() # 关闭消费者生成器
print("[Producer] Close Producer ......")
produce(consumer())