erjemin
Фев. 11, 2013 19:49:05
Вот такой вопрос, а что будет если рекурсивно открывать файлы и коннекты к БД??? Python сам разбьерется или все рухнет?
Вопрос чисто теоретический. Но ответ услышать было бы интересно. Потому как выхода вижу два:
1. Функция открывает коннекты и файлы… а дальше при вызове самой себя передает через флажек самой себе сигнальчик стоит это делать повторно или нет….
2. Закрывать все коннекты веред вызовом самой себя…
первое сложно в написании, т.к. структура всего нехилая… второе, думаю, медленно (там много рекурсивных вызовов) Вот если бы было третье – Python сам во всем разберется и повторно ничего не отрывает и раньше времени не закрываем – было бы идеально…
Soteric
Фев. 11, 2013 19:56:52
Чисто теоретически питон сам ничего не закроет пока ему не скажут.
erjemin
Фев. 11, 2013 20:53:48
Т.е. он будет коннектится в одну и туже базу и открывать уже открытый файл заново???
Досадно. Очень не хочется устраивать ад с симофорами. Хотя, все эти открытия файлов и БД занимают ~8 мс… даже если 100 раз закрыть-открыть не критично…
Soteric
Фев. 11, 2013 20:58:36
Управление коннектами обычно делается через пул. Управление файлом (если это какой-то вырожденный специфичный случай) можно также вынести в отдельный объект. Никогда не слышал, чтобы в этих случаях применялась рекурсия. Опишите задачу.
erjemin
Фев. 11, 2013 21:16:09
Написал скрипт который парсит котировки. В зависимости от того что нужно лезит по разным url и по разным паттернам получает чего надо. Паттерны тоже лежат в базе (отдельной табличкой) в которую все парсится. Если нужно пропарсить ВСЕ то идеально вызывать саму себя подставляя по очереди данные из таблицы с патернами. Только получится что вызывая саму себя открывается база которая уже открыта… Кроме того ведется лог всего этого безобразия 9т.е. дергается файл). Лог пишется отдельной функцией которая определяется внутри функции парсера в случае если по TRY файл открылся… соответственно получаем, что и проверка на открытие фала и определение функции записи лога будет происходить рекурсивно…
Вынести все в функции и каждой из них отрыл-файл-записал-закрыл-файл… открыл коннект-записал в БД-закрыл-коннект не самый лучший вариант. Очень тормозит т.к. вызовов много…
Т.е. решение – предавать через внешний флаг или параметры признак “открывать коннекты и файлы” или нет?
Soteric
Фев. 11, 2013 21:25:43
Нет. Решение открыть один раз коннект и файл (не до конца уловил что это за файл) в начале работы. В цикле ходить по урл, применять паттерны, писать в открытый коннект и файл. По окончании закрыть коннект и файл. Почему так нельзя?
erjemin
Фев. 12, 2013 14:22:42
Можно… просто тогда функции будут не универсальные. Например, функция записи в лог. Ей передают статус, она его обвязывает датами и кодами и пишет в лог. А что если вызовут функцию когда лог-фал не открыт еще? Т.е. я то ее не вызову, но вдруг кто-то лет через пару будет что-то докручивать в разработке?
Тоже самое и с коннектами. Особенно в рекурсии. Если делать функцию где идет работа с БД из расчета что все коннекты уже открыты, то фтакую функцию можно будет вызывать в рекурсии, но нельзя как-то вне открытого коннекта… И еще есть минус, все записи в базе случатся после exec а он тоже ресурс жрет… НО если его внутри рекурсивной функции не вызывать, то вся работа по обработке данных (предположительно) откатится на начало рекурсии, а это тоже не здорово. Пойди разберись где там рекурсия загнулась и на каких данных споткнулась… Это же парсер. Он может из интернета что-то вытащить, что база и не проглотит…
Soteric
Фев. 12, 2013 15:48:48
Разделяйте ответственность между функциями (классами, компонентами). Парсер не должен знать открыт коннект к базе или закрыт, открывать его или закрывать. Он должен попросить у кого-то коннект, а тот сам должен озадачиться и открыть его или бросить исключение, что связи с базой данных нет. То же самое с логером. Можно еще как-то без рекурсии обойтись? :)
erjemin
Фев. 12, 2013 16:14:41
А есть возможность посмотреть-проверить открыт фал или коннект или нет? Не передавать же его через параметры?? В Си я это решал через глобальные параметры. Лог-файл же един на всю баллалайку и БД тоже…
Soteric
Фев. 12, 2013 16:38:53
Если вы сами открываете файл и коннект, то вы знаете открыт он или закрыт. Он же не закроется сам по себе.