LINUX.ORG.RU

История изменений

Исправление slovazap, (текущая версия) :

Если я правильно понял что задачи независимы то всё проще простого же. Для начала тебе нужна очередь (как я понимаю задач не супер много, поэтому её можно делать на чём угодно, хоть на файлах, хоть на postgresql, хоть на redis, хоть на этих модных хреноmq).

Потом, тебе нужен обработчик на asyncio. Он может выполнять несколько задач конкурентно, вплоть до какого-то потолка который зависит от реального соотношения CPU и IO в задаче, и потолок этот возможно будет меньше 100% загрузки 1 CPU, поскольку чем больше времени тратится в сыром CPU тем хуже работает asyncio -> растут задержки IO и пропускная способность падает. Это можно прикинуть, выяснить экспериментально или даже сделать автотюнинг. Может статься что тебе и одного ядра хватит на всё.

А если нет, то таких независимых обработчиков запускаешь от «сколько хватит» до «столько, чтобы загрузить все ядра» и тем самым тривиально масштабируешься. Если очередь позволяет можно даже на несколько машин.

Вроде всё. Все ядра тебе доступны, о проблемах с GIL и многопоточностью можешь даже не задумываться, тяжёлых ресурсов (типа процессов или подключений к БД) нужно тратить фиксированное число - O(обработчиков) вместо O(количества одновременных задач), код на asyncio получается простой.

Исходная версия slovazap, :

Ну для начала тебе нужна очередь (как я понимаю задач не супер много, поэтому её можно делать на чём угодно, хоть на файлах, хоть на postgresql, хоть на redis, хоть на этих модных хреноmq).

Потом, тебе нужен обработчик на asyncio. Он может выполнять несколько задач конкурентно, вплоть до какого-то потолка который зависит от реального соотношения CPU и IO в задаче, и потолок этот возможно будет меньше 100% загрузки 1 CPU, поскольку чем больше времени тратится в сыром CPU тем хуже работает asyncio -> растут задержки IO и пропускная способность падает. Это можно прикинуть, выяснить экспериментально или даже сделать автотюнинг. Может статься что тебе и одного ядра хватит на всё.

А если нет, то таких независимых обработчиков запускаешь от «сколько хватит» до «столько, чтобы загрузить все ядра» и тем самым тривиально масштабируешься. Если очередь позволяет можно даже на несколько машин.

Вроде всё. Все ядра тебе доступны, о проблемах с GIL и многопоточностью можешь даже не задумываться, тяжёлых ресурсов (типа процессов или подключений к БД) нужно тратить фиксированное число - O(обработчиков) вместо O(количества одновременных задач), код на asyncio получается простой.