我一直在阅读线程池模式,但似乎找不到以下问题的通常解决方案。
有时我想按顺序执行任务。例如,我从文件中读取文本块,并且由于某些原因,我需要以这种顺序处理这些块。因此,基本上我想要消除 某些任务的并发性。
考虑以下场景,需要按照推入顺序处理带有*
的任务。其他任务可以以任何顺序处理。
push task1
push task2
push task3 *
push task4 *
push task5
push task6 *
....
and so on
在线程池的上下文中,如果没有这个限制,一个待处理任务的队列就能正常工作,但显然这里不行。
我考虑让一些线程操作特定于线程的队列,而其他线程则操作“全局”队列。然后,为了按顺序执行一些任务,我只需要将它们推到单个线程查看的队列中即可。这听起来有点笨拙。
所以,这个长故事中真正的问题是:你会如何解决? 你会如何确保这些任务有序?
编辑
作为一个更普遍的问题,假设上述场景变成
push task1
push task2 **
push task3 *
push task4 *
push task5
push task6 *
push task7 **
push task8 *
push task9
....
and so on
我的意思是,同一组内的任务应该按顺序执行,但是不同组之间的任务可以混合。因此,例如可以有3-2-5-4-7
。
另外需要注意的一点是,我无法提前访问所有组内的任务(也不能在等待所有任务到达后再开始组内任务)。