Добрый день. Возникла необходимость сделать следующее.
На старте мы запускаем, допустим, с десяток корутин. Их задача - брать из очереди задачи и выполнять их. Если же задачи нету, то тогда необходимо просто спать и отдавать управление в event loop. Но к самим задачам, которые мы добавляем, должен так же прибавлятся дополнительный 'тег'. Грубо говоря, метка. При запросе задачи из очереди, мы можем в параметрах передать тег или список тегов, по которым задачи возвращаться не должны. Как такое реализовать? Писать свою очередь? Как вариант - брать задачу из очереди, и если она не нужного нам типа, то тогда просто возвращать ее обратно в очередь. Но мне кажется, что это просто хак и будет работать он очень медленно, т.к перебирать задачи мы можем долго таким образом + гонять их туда-сюда. Второй вариант, приходящий в голову - использовать какие-либо примитивы синхронизации и создавать на каждый тип задачи отдельную очередь, уведомляя о ней корутины. Если сформулировать задачу более формально, то необходимо следующее - мы создаем кучу одинаковых задач, их может быть =< количество корутин. Все должны быть выполнены, но каждая корутина не должна взять больше одной задачи. Подвох в том, что в процессе получения задач из очереди, мы можем добавить еще туда одинаковых задач, но уже «другого» типа.