Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的由lua coroutine实现的生产者-消费者模型不能正常工作_Lua_Coroutine_Producer Consumer - Fatal编程技术网

为什么我的由lua coroutine实现的生产者-消费者模型不能正常工作

为什么我的由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已不存在。应该打印两次,但现在只

我使用协同程序来实现生产者-消费者模型。我的代码如下:

函数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发送更多数据,这是不正确的。