为什么我的由lua coroutine实现的生产者-消费者模型不能正常工作
我使用协同程序来实现生产者-消费者模型。我的代码如下: 函数sendprod,x coroutine.resumeprod,x 终止 函数接收 局部x=协同程序 返回x 终止 功能消费者 返回coroutine.createfunction 尽管如此 本地x=接收 io.writex\n 终止 终止 终止 功能生产商 尽管如此 本地x=io.read sendprod,x 终止 终止 生产者消费者 当我运行此代码时,我得到: 第一个输入消息Hello World已不存在。应该打印两次,但现在只打印一次。在我看来,我的生产者-消费者模式的流程图应该如下所示:为什么我的由lua coroutine实现的生产者-消费者模型不能正常工作,lua,coroutine,producer-consumer,Lua,Coroutine,Producer Consumer,我使用协同程序来实现生产者-消费者模型。我的代码如下: 函数sendprod,x coroutine.resumeprod,x 终止 函数接收 局部x=协同程序 返回x 终止 功能消费者 返回coroutine.createfunction 尽管如此 本地x=接收 io.writex\n 终止 终止 终止 功能生产商 尽管如此 本地x=io.read sendprod,x 终止 终止 生产者消费者 当我运行此代码时,我得到: 第一个输入消息Hello World已不存在。应该打印两次,但现在只
我弄错了吗?输入第一个字符串后,将按以下顺序调用函数: 邮寄 消费者返回的协同程序, 接收 制作人 然后程序等待用户输入。 本地x=协同程序。产量,因此本地x=向生产商接收产量。io.writex,\n在此阶段无法访问 用户输入第二行后,它如下所示: 邮寄 在本地x=接收并打印第二个输入后,消费者恢复, 在其无休止的循环中,消费者呼叫接收, 向生产者收取收益, 它等待用户输入。 下面是更正确的代码: 本地函数发送x yieldx公司 终止 本地函数接收产品 本地状态,值=coroutine.resumeprod 返回值 终止 局部函数生成器 返回coroutine.create 作用 尽管如此 本地x=io.read-生成新值 森德 终止 终止 终止 功能消费品 尽管如此 本地x=接收产品-获取新值 io.writex,\n-使用新值 终止 终止 消费者生产者 请注意,它是消费者生产者,而不是反过来。还要注意,生产者是协同程序,而不是消费者。同时发送收益和接收简历 消费者开始节目,一次又一次地恢复制作人。如果情况正好相反,如您的示例中所示,消费者在第二次迭代之前还没有准备好消费产品 UPD:以下为强制进给,即生产者驱动,代码: 本地函数发送cons,x 协同程序,恢复cons,x 终止 本地函数接收 收益率 终止 局部函数消费者 返回coroutine.create 函数x 尽管如此 io.writex,“\n” -返回coroutine.resume的额外参数 x=接收 终止 终止 终止 函数生成器cons 尽管如此 本地x=io.read-生成新值 发送cons,x-输入新值 终止 终止 生产者消费者 与作者的示例不同的是,生产者发送给消费者,而receive在write之后
进一步阅读:。输入第一个字符串后,将按以下顺序调用函数: 邮寄 消费者返回的协同程序, 接收 制作人 然后程序等待用户输入。 本地x=协同程序。产量,因此本地x=向生产商接收产量。io.writex,\n在此阶段无法访问 用户输入第二行后,它如下所示: 邮寄 在本地x=接收并打印第二个输入后,消费者恢复, 在其无休止的循环中,消费者呼叫接收, 向生产者收取收益, 它等待用户输入。 下面是更正确的代码: 本地函数发送x yieldx公司 终止 本地函数接收产品 本地状态,值=coroutine.resumeprod 返回值 终止 局部函数生成器 返回coroutine.create 作用 尽管如此 本地x=io.read-生成新值 森德 终止 终止 终止 功能消费品 尽管如此 本地x=接收产品-获取新值 io.writex,\n-使用新值 终止 终止 消费者生产者 请注意,它是消费者生产者,而不是反过来。还要注意,生产者是协同程序,而不是消费者。同时发送收益和接收简历 消费者开始节目,一次又一次地恢复制作人。如果情况正好相反,如您的示例中所示,消费者在第二次迭代之前还没有准备好消费产品 UPD:以下为强制进给,即生产者驱动,代码: 本地函数发送cons,x 协同程序,恢复cons,x 终止 本地函数接收 收益率 终止 局部函数消费者 返回coroutine.create 函数x 尽管如此 io.writex,“\n” -返回coroutine.resume的额外参数 x=接收 终止 终止 EN D 函数生成器cons 尽管如此 本地x=io.read-生成新值 发送cons,x-输入新值 终止 终止 生产者消费者 与作者的示例不同的是,生产者发送给消费者,而receive在write之后
进一步阅读:。第一次恢复协同程序时,它不会直接跳转到第一个成品,而是使用给定的参数调用包装函数: 本地co=coroutine.wrapfunctionaaa 打印AAA-先打印 printcoroutine.yield-第二次打印 终止 共同第一 秒 在代码中修复此问题的简单方法: 本地发送、接收= 合作进程,合作进程,合作进程 功能消费者 返回coroutine.createfunctionx 尽管如此 io.writex\n x=接收 终止 终止 终止 功能生产者消费者 尽管如此 本地x=io.read sendconsumer,x 终止 终止 生产者消费者
第一次恢复协同程序时,它不会直接跳到第一个成品,而是使用给定参数调用包装函数: 本地co=coroutine.wrapfunctionaaa 打印AAA-先打印 printcoroutine.yield-第二次打印 终止 共同第一 秒 在代码中修复此问题的简单方法: 本地发送、接收= 合作进程,合作进程,合作进程 功能消费者 返回coroutine.createfunctionx 尽管如此 io.writex\n x=接收 终止 终止 终止 功能生产者消费者 尽管如此 本地x=io.read sendconsumer,x 终止 终止 生产者消费者
谢谢你的回答!但这不是我想要的。我知道这种实现生产者-消费者模型的方法。在我看来,这个问题的关键不在于procuder是否是协程的。如果procuder是corroutine而consumer不是的模型可以正常工作,那么相反的方法也应该正常工作。这个问题是第285页Lua第四版练习24.1中的编程练习。它要求我使用生产者驱动模式来实现生产者-消费者模型。我尝试在声明producerconsumer之前手动恢复consumer。cod如下所示:lua-some code local co=consumer coroutine.resumeco producerco,它可以工作。@Phoenix Chao,谢谢你接受,但请阅读更新的答案。非常感谢!我知道了,你不能在恢复时向coroutine发送更多数据。这是不正确的。谢谢你的回答!但这不是我想要的。我知道这种实现生产者-消费者模型的方法。在我看来,这个问题的关键不在于procuder是否是协程的。如果procuder是corroutine而consumer不是的模型可以正常工作,那么相反的方法也应该正常工作。这个问题是第285页Lua第四版练习24.1中的编程练习。它要求我使用生产者驱动模式来实现生产者-消费者模型。我尝试在声明producerconsumer之前手动恢复consumer。cod如下:lua-some code local co=consumer coroutine.resumeco producerco,它可以工作。@Phoenix Chao,谢谢你接受,但请阅读更新的答案。非常感谢!我知道了,你不能在恢复时向coroutine发送更多数据,这是不正确的。