【问题标题】:Worker pool where certain tasks can only be done by certain workers工作人员池,其中某些任务只能由某些工作人员完成
【发布时间】:2012-06-19 11:11:42
【问题描述】:

我有很多任务想一次执行几个。正常的解决方案是线程池。但是,我的任务需要只有某些线程拥有的资源。所以我不能只将任务分配给任何旧线程;线程必须拥有任务所需的资源。

似乎应该有一个并发模式,但我似乎找不到它。我在 Python 2 中通过多处理实现了这一点,所以这些术语的答案会很好,但通用的解决方案很好。在我的情况下,“线程”实际上是独立的操作系统进程,资源是网络连接(不,它不是服务器,所以 (e)poll/select 不会有帮助)。一般来说,一个线程/进程可以拥有多个资源。

这是一个幼稚的解决方案:将任务放在工作队列中,然后将我的线程池放开。让每个线程检查“我可以执行此任务吗?”如果是,就去做;如果不是,则将其放回队列中。但是,如果每个任务只能由 N 个线程中的一个来完成,那么我将花费大约 2N 次昂贵的、浪费的访问共享队列来获得一个工作单元。

这是我目前的想法:为每个资源设置一个共享的工作队列。将任务分配到匹配队列。每个线程检查它可以处理的队列。

想法?

【问题讨论】:

  • 我冒昧地更改了标题;正如你所说,你的线程实际上并不是线程,所以更一般的东西似乎是合适的。线程和进程的解决方案可能基本相同,但是在提出关于线程的问题然后发现它不是关于线程的问题时,心理上会遇到障碍(至少对我来说是这样)。您可能想稍微重新措辞一下问题,使其更加流畅。
  • 我认为您对每个资源的队列的想法很好。工作人员将需要检查多个队列,这意味着他们不能使用阻塞读取,并且必须对这些队列(实际上是资源)进行优先级排序。

标签: python multithreading concurrency process threadpool


【解决方案1】:

解决此问题的一种常见方法是不为线程分配资源并将适当的资源与数据一起排队,但我明白如果资源绑定到特定线程,这并不总是可行的。

每个资源使用一个队列,线程只从包含它可以处理的对象的队列中弹出对象的想法可能有效。

可以使用信号量+concurrentQueue 数组,按资源索引,用于向此类线程发送信号并提供优先级系统,从而消除大部分轮询和浪费的重新排队。我将不得不考虑更多 - 这有点取决于资源如何映射到线程。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 2023-03-25
    • 2021-12-04
    • 2013-06-17
    • 2018-08-03
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多