На чём лучше писать большого демона?
======================================

 Задача написать большую сложную систему которая будет стабильно работать в фоновом режиме длительное время.   
  

Сам я специализируюсь на PHP но понимаю что он под эту задачу не очень подходит.  
  

Что посоветуете? Руби, питон, с фреймворком или чистый.  
  

Хотелось бы иметь удобною работу с бд (ORM?), http.  
  

Спасибо. 

 Небольшая история.  

 — Первый свой демон писал на Питоне (это был питон 2.6 или 2.7, не помню уже). Работал но кушал много памяти, при чём со временем кушал всё больше. Разлюбил.  

  

Затем начал писать на perl. Всё было хорошо, до тех пор пока демон должен был работать на Linux. Когда понадобилось перенести на Windows, обнаружились проблемы (форки рождались, но не убивались), которые так и не удалось решить. Возможно perl сильно полагается на архитектуру Linux.  

  

Затем я решил попробовать ruby и обнаружил скриптовый рай. Демон, который прежде был написан на perl был легко перенесён на ruby, при чём код сократился раза в два. Под Windows не пришлось допиливать вообще ничего. Работает одинаково везде.  

 — В конце концов я для себя решил, что если писать скрипты-утилиты, то и perl и bash подойдёт, а если демоны, то ruby.  

Производительность я не беру в учёт, т.к. никогда не требовалось, а вот по простоте и переносимости ruby на высоте. 

 Настоящих демонов пишут на Аде. 

 Автор, понимаю вас. Когда-то я имел неосторожность написать демона на PHP, о чем жалею. Хоть работал стабильно, но меня он харил.  

  

Python — замечательный язык для такой задачи, те кто пишут про утечки памяти, не сильно помогали сборщику мусора.  

Я пишу демонический вебсокет сервер, при тысяче входов и выходов, на протяжении нескольких дней, утечки не зафиксированы. Как код жрал 7мб оперативки, так после отключения всех юзеров и продолжал жрать 7мб оперативки. Отличия сводились на килобайты.   

  

Если вы решите написать на пайтоне, то пара рекомендаций:  

 — Под каждую итерацию обработки данных, создавайте экземпляр класса, в который войдут другие под классы, которые будут проводить обработки данных. Не складируйте ссылки на объекты в модулях или не уничтожаемых классах. Классы после каждой итерации должны уничтожаться.  

 — Идите ближе к функциональному стилю. Вы дали какой-то функции данные, она вернула результат.  

  

Ничего не оставляйте без присмотра. 

 Большая и сложная система? Прорекламирую ключевые особенности Golang применительно к вашему случаю:  

 — статическая типизация  

 — легковесные потоки «из коробки»  

 — обширная стандартная библиотека  

 — встроенная система юнит-тестирования  

 — прост в изучении для PHP программистов  

  

[golang.org](http://golang.org) 

 Рекомендую посмотреть в сторону phpdaemon 

 Думаю, вам подойдет Perl или Erlang. Perl очень легко учится после PHP, на нем без труда пишутся демоны, есть замечательный ORM (DBIx::Class). Erlang прекрасен неизменяемыми переменными, функциональным стилем, многопоточностью и автоматической сборкой мусора. Есть замечательный веб-сервер (не фреймворк) Cowboy. Правда, с ORM у него не все гладко, как и с дровами для СУБД (в emysql есть известные незакрытые баги, в epgsql — проблемы с производительностью, если запросов очень много). Обо многом из перечисленного я когда-то писал у себя в [бложике](http://eax.me/), можете по нему поискать. 

 питон достаточно удобен и популярен для таких задач. но следует учесть что жруч, например, до памяти.  

демон демону люпус эст.  

смтря какой демон. разные требования бывают. 

 На твоем месте я бы остановился на PHP. Попутно разобрался бы с тем что такое crontab. Если этого тебе будет мало, будешь думать о чем то ещё. 

 Perl отлично подойдёт. 

 Если вам надо серьезное большое многопоточное приложение — лучше смотреть в сторону java. Тамошняя библиотека, да и виртуальная машина, наиболее предпочтительней подходят под такие задачи.  

  

Python, Ruby имеют GIL. И серьезных инструментов для многопоточности в них нет.  

В python есть обход GIL — пакет multiprocessing, если смотреть то на него. ORM — SQLAlchemy, http — есть базовый и другие библиотеки.  

  

А вообще надо смотреть задачи, а то может вам и php хватит. 

 в первую очередь все зависит от задач демона!  

приведу пример: у меня есть демон собирающий много статистики с моих проектов и контролирующий их доступность. проекты на контроле разные, есть и средненагруженные.  

так вот, демон написан на питоне и работает на моем старом десктопе на базе intl celeron 1,7 с 2 гигами оперативы(DIMM)  

комп под управлением ubuntu server  

железо вполне вытягивает решаемые демоном задачи. 

 C# отлично подойдет, делаю на нем невыгружаемые приложения, стабильно работают месяцами, память не протекает. 

 Один большой лучше не делать. А написать несколько, которые выполняют различные задачи. А тут уже решать на чем писать. Где то хватит и Bash, где то необходим (либо быстрее) тот же PHP. Если грамотно писать никуда ничего не течет. Еще обязательно на демон повесить что то типа monit. 

 Выше уже сказали про требования, поэтому важно знать  

1. критично ли потребление памяти? надо ли уложиться в 50 мб, 100 мб, 200 мб?   

2. нужно ли отвечать параллельно на несколько запросов и нужна ли реальная многопоточность?   

  

Если на второй вопрос ответ «да», то Erlang, например. 

 Я пишу на PHP, работает стабильно, но хочется перейти на Go [plutov.by/post/php\_daemons](http://plutov.by/post/php_daemons)