Что вы используете, это глобальная блокировка интерпретатора python. GIL позволяет только один поток запускать в интерпретаторе python.
Одним из преимуществ Boost.Python является то, что вы можете освободить GIL, сделать C ++, а затем вернуть его, когда закончите. Это также несет ответственность. Python обычно выпускает GIL через регулярные промежутки времени, чтобы дать другим потокам возможность запускать. Если вы находитесь на C ++, это ваша работа. Если вы продолжаете хруст в течение 2 часов, удерживая GIL, вы заморозите весь интерпретатор.
Это можно легко исправить с помощью небольшого обратного RAII:
class releaseGIL{
public:
inline releaseGIL(){
save_state = PyEval_SaveThread();
}
inline ~releaseGIL(){
PyEval_RestoreThread(save_state);
}
private:
PyThreadState *save_state;
};
Теперь вы можете изменить свой код так:
class Foo{
public:
Foo(){}
void run(){
{
releaseGIL unlock = releaseGIL();
int seconds = 2;
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
}
};
ОЧЕНЬ важно отметить, что вы НЕ ДОЛЖНЫ касаться какого-либо кода на основе питона или данных python или обращаться к интерпретатору, не удерживая GIL. Это приведет к сбою вашего интерпретатора.
Также можно пойти в другую сторону. Нить, в настоящее время не содержащая GIL, может получить ее и выполнить вызовы на python. Это может быть поток, который ранее выпускал GIL, или тот, который начинался на c ++ и никогда не имел GIL. Вот для этого класс RAII:
class AcquireGIL
{
public:
inline AcquireGIL(){
state = PyGILState_Ensure();
}
inline ~AcquireGIL(){
PyGILState_Release(state);
}
private:
PyGILState_STATE state;
};
Использование осталось в качестве упражнения для ученика.
Дополнительная заметка (я всегда забываю упомянуть об этом):
Если вы собираетесь возиться с GIL в c ++, ваше определение модуля должно начинаться с этого кода:
BOOST_PYTHON_MODULE(ModuleName)
{
PyEval_InitThreads();
...
}
По-моему, это - довольно значительная дыра, которая подавляет широко распространенное принятие Solr. Новый DataImportHandler является хорошим первым шагом для импорта структурированных данных, но нет хорошего конвейера приема пищи документа для Solr. Nutch действительно работает, но интеграция между поисковым роботом Nutch и Solr несколько неуклюжа.
я попробовал каждый поисковый робот с открытым исходным кодом, который я могу найти, и ни один из них не интегрирует out-of-the-box с Solr.
Следят за OpenPipeline и Apache Tika.
Также проверьте Droid Apache [ http://incubator.apache.org/droids/] - это надеется не быть простой платформой паука/поискового робота/рабочего.
Это является новым и еще не является простым в использовании с полки (потребуется некоторая тонкая настройка для получения выполнения), но хорошая вещь бдительно следить за.
Nutch мог бы быть Вашим самым близким соответствием, но это не слишком гибко.
, Если Вам нужно что-то больше, что необходимо будет в значительной степени взломать собственный поисковый робот. Это не настолько плохо, как это звучит, каждый язык имеет веб-библиотеки, таким образом, просто необходимо соединить некоторый диспетчер очереди задачи с загрузчиком HTTP и синтаксический анализатор HTML, это не действительно так много работы. Можно, скорее всего, сойти с рук единственное поле, поскольку проверка является главным образом пропускной-способностью-intentive, не интенсивной ЦП.
docs
я заканчиваю тем, что имел поля как _id
который я don' t хотят иметь.
– Masiar
4 March 2012 в 10:22
Я предлагаю, чтобы Вы проверили Nutch для получения некоторого вдохновения:
Nutch является программным обеспечением веб-поиска с открытым исходным кодом. Это основывается на Java Lucene, добавляя веб-специфические особенности, такие как поисковый робот, база данных графика ссылки, синтаксические анализаторы для HTML и других форматов документов, и т.д.
Я попробовал Nutch, но было очень сложно интегрироваться с Solr. Я бы посмотрел на Heritrix. Он имеет обширную систему плагинов, облегчающую интеграцию с Solr, и намного быстрее при сканировании. Он широко использует потоки для ускорения процесса.
Кто-нибудь пробовал Xapian? Он выглядит намного быстрее, чем solr и написан на c ++.
Where
для реализации собственногоJoin
.Join
делает лучше задание передачи значения читателю в результате. – Servy 2 April 2013 в 20:34