【问题标题】:In an environment with multiple coroutines, is it sane to implement priorities? [closed]在有多个协程的环境中,实现优先级是否明智? [关闭]
【发布时间】:2012-09-07 03:42:13
【问题描述】:

我正在阅读一些 Lua 书籍,并且正在考虑将一些遗留(并且写得不好)的 C 代码迁移到 Lua 和 C 的混合体中。

但是,这个遗留代码使用线程来处理一些关键任务(基本上是音频/视频流),而有些简单的任务也需要一些关注(用户界面)。根据我的阅读,Lua 并不直接支持线程,而是提倡使用协程。

在这种情况下迁移到基于协程的环境是否明智?在我看来,我可以想象一个调度程序,它总是在每次尝试恢复最不重要的协程之间首先尝试恢复高优先级协程。由于我没有这方面的经验,所以我在这里问。

编辑

尼可波拉斯询问了更多细节。

这是一个实时应用程序。我不能承受很大的延迟来处理某些事件,例如准备处理的新视频帧。之前的 C 程序使用线程和回调来执行此操作。例如,在出现新帧时,会调用回调并准备数据进行处理(回调作为生产者,视频线程作为消费)。

我还没有考虑如何处理回调(也许我会将它们保留在 C 中并使用一些互斥锁来更新 Lua 代码的数据),但我怀疑这种设置是否使用上述工具适用于此类问题,如果有人有一些示例或故事并希望分享。

【问题讨论】:

  • 没有看到代码,或者对具体情况有更多了解,很难有把握地回答这个问题。
  • 还没有代码。如果协程对于这种类型的应用程序是否值得,我正在征求意见。这是一个实时应用程序(流媒体)。是协程。他们相处得好吗?

标签: multithreading lua coroutine


【解决方案1】:

你没有理由不试试这个。游戏旨在创建一个适当的调度程序,并确保您的任何例程都不会花费太多时间才能完成。

这有多难取决于您的代码,但调度程序可能非常简单——通过优先级或简单的计时器(如果上一次运行重要的例程大于 N 毫秒,则运行重要的例程)。

yield 有一些优势,它确实使同步变得容易。

简单地说,你应该证明它,看看它是否对你足够有效。稍微玩一下,你应该很快就知道这是否真的适合你,从它的声音来看,你的调度程序可能不是很复杂。没有理由让它成为一个通用的,保持简单并专注于你正在做的任务,然后你循环“通用的”,或者从操作系统教科书中拉出一些随机调度程序。

【讨论】:

    【解决方案2】:

    你可能可以做到这一点;据我所知,您面临的主要挑战将是决定您可以放弃的最小时间段以及如何保证不超过这段时间。

    例如,假设您的流媒体可以容忍长达 10 毫秒的延迟。这意味着您的 UI 操作必须分成不超过 10 毫秒的块。如果你恢复你的 UI 协程在文件中进行搜索并且你需要读取一个文件并且它变得很大并且读取时间超过了 10 毫秒怎么办?在您的 UI 协程将控制权交还给调度程序之前,您的流式协同程序不会获得控制权,然后调度程序会恢复您的流式协同程序。这仅意味着您需要非常小心地考虑您的 UI 可以执行的所有操作,以及如何保证所有操作都遵守您为它们设置的时间限制。

    在抢占式多任务处理中,调度程序会处理这一点(但它也有自己的缺点),但在协程的情况下,您的 UI 逻辑需要处理它。有一些 lua 库具有一些类似的逻辑(例如,copas 所做的事情接近于您可能需要的使用超时的套接字)。

    比较回调和协程,我开始越来越喜欢协程的方法。它们的功能可能是相同的,但是基于协程的代码比基于回调的代码更容易阅读(并且在许多情况下更容易编写)(严格来说,在我看来)。

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多