Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2013 19:49:05

erjemin
Зарегистрирован: 2012-07-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Вот такой вопрос, а что будет если рекурсивно открывать файлы и коннекты к БД??? Python сам разбьерется или все рухнет?

Вопрос чисто теоретический. Но ответ услышать было бы интересно. Потому как выхода вижу два:

1. Функция открывает коннекты и файлы… а дальше при вызове самой себя передает через флажек самой себе сигнальчик стоит это делать повторно или нет….

2. Закрывать все коннекты веред вызовом самой себя…

первое сложно в написании, т.к. структура всего нехилая… второе, думаю, медленно (там много рекурсивных вызовов) Вот если бы было третье – Python сам во всем разберется и повторно ничего не отрывает и раньше времени не закрываем – было бы идеально…

Офлайн

#2 Фев. 11, 2013 19:56:52

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Чисто теоретически питон сам ничего не закроет пока ему не скажут.



Офлайн

#3 Фев. 11, 2013 20:53:48

erjemin
Зарегистрирован: 2012-07-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Т.е. он будет коннектится в одну и туже базу и открывать уже открытый файл заново???
Досадно. Очень не хочется устраивать ад с симофорами. Хотя, все эти открытия файлов и БД занимают ~8 мс… даже если 100 раз закрыть-открыть не критично…

Офлайн

#4 Фев. 11, 2013 20:58:36

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Управление коннектами обычно делается через пул. Управление файлом (если это какой-то вырожденный специфичный случай) можно также вынести в отдельный объект. Никогда не слышал, чтобы в этих случаях применялась рекурсия. Опишите задачу.



Офлайн

#5 Фев. 11, 2013 21:16:09

erjemin
Зарегистрирован: 2012-07-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Написал скрипт который парсит котировки. В зависимости от того что нужно лезит по разным url и по разным паттернам получает чего надо. Паттерны тоже лежат в базе (отдельной табличкой) в которую все парсится. Если нужно пропарсить ВСЕ то идеально вызывать саму себя подставляя по очереди данные из таблицы с патернами. Только получится что вызывая саму себя открывается база которая уже открыта… Кроме того ведется лог всего этого безобразия 9т.е. дергается файл). Лог пишется отдельной функцией которая определяется внутри функции парсера в случае если по TRY файл открылся… соответственно получаем, что и проверка на открытие фала и определение функции записи лога будет происходить рекурсивно…

Вынести все в функции и каждой из них отрыл-файл-записал-закрыл-файл… открыл коннект-записал в БД-закрыл-коннект не самый лучший вариант. Очень тормозит т.к. вызовов много…

Т.е. решение – предавать через внешний флаг или параметры признак “открывать коннекты и файлы” или нет?

Офлайн

#6 Фев. 11, 2013 21:25:43

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Нет. Решение открыть один раз коннект и файл (не до конца уловил что это за файл) в начале работы. В цикле ходить по урл, применять паттерны, писать в открытый коннект и файл. По окончании закрыть коннект и файл. Почему так нельзя?



Офлайн

#7 Фев. 12, 2013 14:22:42

erjemin
Зарегистрирован: 2012-07-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Можно… просто тогда функции будут не универсальные. Например, функция записи в лог. Ей передают статус, она его обвязывает датами и кодами и пишет в лог. А что если вызовут функцию когда лог-фал не открыт еще? Т.е. я то ее не вызову, но вдруг кто-то лет через пару будет что-то докручивать в разработке?

Тоже самое и с коннектами. Особенно в рекурсии. Если делать функцию где идет работа с БД из расчета что все коннекты уже открыты, то фтакую функцию можно будет вызывать в рекурсии, но нельзя как-то вне открытого коннекта… И еще есть минус, все записи в базе случатся после exec а он тоже ресурс жрет… НО если его внутри рекурсивной функции не вызывать, то вся работа по обработке данных (предположительно) откатится на начало рекурсии, а это тоже не здорово. Пойди разберись где там рекурсия загнулась и на каких данных споткнулась… Это же парсер. Он может из интернета что-то вытащить, что база и не проглотит…

Офлайн

#8 Фев. 12, 2013 15:48:48

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Разделяйте ответственность между функциями (классами, компонентами). Парсер не должен знать открыт коннект к базе или закрыт, открывать его или закрывать. Он должен попросить у кого-то коннект, а тот сам должен озадачиться и открыть его или бросить исключение, что связи с базой данных нет. То же самое с логером. Можно еще как-то без рекурсии обойтись? :)



Офлайн

#9 Фев. 12, 2013 16:14:41

erjemin
Зарегистрирован: 2012-07-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

А есть возможность посмотреть-проверить открыт фал или коннект или нет? Не передавать же его через параметры?? В Си я это решал через глобальные параметры. Лог-файл же един на всю баллалайку и БД тоже…

Офлайн

#10 Фев. 12, 2013 16:38:53

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Рекурсивное открытие файлов, коннектов и пр...

Если вы сами открываете файл и коннект, то вы знаете открыт он или закрыт. Он же не закроется сам по себе.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version