2013-11-12 2 views
1

У меня типичное широкое семейство столбцов с данными {rowkey -> uuid4 + date и timeseries как столбцы}, на которых я реализовал запрос на основе диапазона, используя вызовы pycassa xget(). Не то, чтобы меня преследовали плохую производительность с помощью однопоточного кода, мне было любопытно понять разницу в производительности, когда вызовы xget() выполняются параллельно, а не последовательно (изнутри цикла for:).Производительность ухудшается для запроса на основе диапазона в семействе колонок cassandra при реализации с использованием многопоточных вызовов pycassa xget()?

Я использовал «поточную» библиотеку python для реализации многопоточной версии запроса на основе диапазона, и производительность значительно ухудшилась. Теперь я знаю о влиянии на Python GIL на многопоточном коде, но есть ли какой-либо способ, которым я могу быть уверен, что это infact, вызванный GIL? Может ли это быть что-то еще, что вызывает это?

Заранее спасибо.

Примечание: Я не рассматриваю библиотеку «многопроцессорности», потому что я не могу позволить себе иметь другой объект ConnectionPool для каждого подпроцесса.

ответ

2

Одна вещь, которую я хотел бы попробовать, - это играть с различными значениями для buffer_size kwarg для xget() (по умолчанию - 1024).

Если проблема с GIL является проблемой, вы увидите, что использование процессора происходит где-то между ~ 90% и ~ 120% для процесса. В противном случае вы можете настроить размер ConnectionPool, чтобы убедиться, что для каждого потока доступно хотя бы одно соединение.

Если все остальное не удается, попробуйте выполнить профилирование своей заявки: http://docs.python.org/2/library/profile.html.