<p>我认为这里最简单的事情是让每个工作进程使用两个<code>Queue</code>对象。一个是特定于浏览器的<code>Queue</code>,另一个是共享的“generic”<code>Queue</code>。这样,您可以让40个进程从Chrome <code>Queue</code>中消耗,然后在耗尽后切换到通用<code>Queue</code>,也可以让40个进程从Firefox<code>Queue</code>消耗,然后在耗尽后切换到通用的<code>Queue</code>。下面是一个使用8个进程而不是80个进程的示例:</p>
<pre><code>from multiprocessing import Pool, Manager
from Queue import Empty
import time
ff_tests = [1,2,3,4,5]
chrome_tests = [10, 11, 12, 13, 14, 15]
general_tests = [20, 21,22, 23,24,25]
def process_func(spec_queue, general_queue, browser):
while True:
try:
test = spec_queue.get_nowait()
print("Processing {} in {} process".format(test, browser))
time.sleep(2)
except Empty:
break
while True:
try:
test = general_queue.get_nowait()
print("Processing {} in {} process".format(test, browser))
time.sleep(2)
except Empty:
break
if __name__ == "__main__":
m = Manager()
ff_queue = m.Queue()
chrome_queue = m.Queue()
general_queue = m.Queue()
for queue, tests in [(ff_queue, ff_tests), (chrome_queue, chrome_tests),
(general_queue, general_tests)]:
for test in tests:
queue.put(test)
pool = Pool(8)
for _ in range(4):
pool.apply_async(process_func, args=(ff_queue, general_queue, "firefox"))
pool.apply_async(process_func, args=(chrome_queue, general_queue, "chrome"))
pool.close()
pool.join()
</code></pre>
<p>输出:</p>
^{pr2}$
<p>如您所见,特定于浏览器的队列在其特定于浏览器的进程中被耗尽,然后这两种类型的进程协同工作以排出通用队列。在</p>