工作人员池,某些任务只能由某些工作人员完成

时间:2012-06-16 20:05:19

标签: python multithreading concurrency process threadpool

我有很多任务,我想一次执行一些。对此的正常解决方案是线程池。但是,我的任务需要只有某些线程才有的资源。所以我不能把任务归于任何旧线程;线程必须拥有任务所需的资源。

似乎应该有一个并发模式,但我似乎无法找到它。我正在使用多处理在Python 2中实现这一点,因此这些术语的答案会很棒,但通用的解决方案很好。在我的情况下,“线程”实际上是单独的OS进程,资源是网络连接(不,它不是服务器,因此(e)轮询/选择不会有帮助)。通常,线程/进程可以拥有多个资源。

这是一个天真的解决方案:将任务放在工作队列中并将我的线程池放在其上。让每个线程检查,“我可以执行此任务吗?”如果是,那就去做;如果不是,请将其放回队列中。但是,如果每个任务只能由N个线程中的一个完成,那么我正在做~2N昂贵的浪费访问共享队列只是为了获得一个工作单元。

这是我当前的想法:为每个资源都有一个共享工作队列。将任务固定到匹配队列。每个线程都会检查它可以处理的队列。

想法?

1 个答案:

答案 0 :(得分:0)

一种常见的方法是不为线程分配资源并使用数据将适当的资源排入队列,但我知道如果资源绑定到特定线程,这并不总是可行。

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

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