【发布时间】:2012-06-19 11:11:42
【问题描述】:
我有很多任务想一次执行几个。正常的解决方案是线程池。但是,我的任务需要只有某些线程拥有的资源。所以我不能只将任务分配给任何旧线程;线程必须拥有任务所需的资源。
似乎应该有一个并发模式,但我似乎找不到它。我在 Python 2 中通过多处理实现了这一点,所以这些术语的答案会很好,但通用的解决方案很好。在我的情况下,“线程”实际上是独立的操作系统进程,资源是网络连接(不,它不是服务器,所以 (e)poll/select 不会有帮助)。一般来说,一个线程/进程可以拥有多个资源。
这是一个幼稚的解决方案:将任务放在工作队列中,然后将我的线程池放开。让每个线程检查“我可以执行此任务吗?”如果是,就去做;如果不是,则将其放回队列中。但是,如果每个任务只能由 N 个线程中的一个来完成,那么我将花费大约 2N 次昂贵的、浪费的访问共享队列来获得一个工作单元。
这是我目前的想法:为每个资源设置一个共享的工作队列。将任务分配到匹配队列。每个线程检查它可以处理的队列。
想法?
【问题讨论】:
-
我冒昧地更改了标题;正如你所说,你的线程实际上并不是线程,所以更一般的东西似乎是合适的。线程和进程的解决方案可能基本相同,但是在提出关于线程的问题然后发现它不是关于线程的问题时,心理上会遇到障碍(至少对我来说是这样)。您可能想稍微重新措辞一下问题,使其更加流畅。
-
我认为您对每个资源的队列的想法很好。工作人员将需要检查多个队列,这意味着他们不能使用阻塞读取,并且必须对这些队列(实际上是资源)进行优先级排序。
标签: python multithreading concurrency process threadpool