lua和python利用协程实现消费-生产者问题

    xiaoxiao2021-12-14  15

    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())
    转载请注明原文地址: https://ju.6miu.com/read-972051.html

    最新回复(0)