LINUX.ORG.RU

Посоветуйте библиотеку для связи.


0

1

Посоветуйте какую-нибудь либу, которая позволит так взаимодействовать главному узлу со служебному. Служебные будут инициировать коннект на мастер, но слать запросы первым будет мастер. Сойдёт извращённый HTTP - когда я коннекчусь на сервер, а он мне шлёт HTTP-запрос, на который я отвечаю. Или другой протокол, где можно обменяниваться сообщениями, перекачивать файлы.

Простейший юз-кейс:
1. Клиент коннектится на сервер и молчит.
2. Сервер шлёт по установившемуся соединению запрос: есть новости?
3. Клиент посылает список новостей.
4. Сервер шлёт запрос на какую-нибудь новость из списка.
5. Клиент её отправляет в виде tar.gz файла.
6. Клиент сам шлёт запрос, и получает какой-нибудь ответ от сервера.
7. Клиент или сервер рвут соединение.

>обменяниваться сообщениями, перекачивать файлы

xmpp

cnupm
()

Во-первых, какой язык? Visual Basic?

Во-вторых, не понимаю, зачем нужны пункты 1 и 2? Кто мешает сразу список заслать?

По HTTP можно «обмениваться сообщениями, перекачивать файлы», но не так, как вы это делаете.

shylent
()
Ответ на: комментарий от shylent

Я вообще пока никак не делаю. Пункты 1 и 2 - один из юзкейсов. Список сразу не засылается, т.е. без спросу сервера ничего не делается. С++

kiverattes ★☆
() автор топика

python+gevent

В качестве «протокола» я использую инстансы(типа class Message: blah-blah) которые прогоняю через pickle, это очень удобно.

true_admin ★★★★★
()

SOAP, XML-RPC, JSON-RPC

Deleted
()
Ответ на: комментарий от shylent

Если уж python, то почему не twisted?

Если говорить о non-blocking io то gevent вне конкуренции потому что позволяет значительно меньше думать о блокировках и коде. Если о тредовой реализации то можно и twisted, кому что ближе.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Какое отношение twisted имеет к тредам? Там, вообще-то, реактор, как и пользовательский код, в одном (главном) треде выполняется, если только нет необходимости ходить к блокирующему API (допустим, к синхронному драйверу БД). Если необходимость есть, то синхронные вызовы можно (и нужно) делегировать в отдельные треды, чтобы не блокировать весь event loop.

shylent
()
Ответ на: комментарий от true_admin

Хм, ну что же, я не буду с вами устраивать бокс по переписке, так как очевидно, что вы с twisted дела не имели.

Про проблемы, возникающие с monkey-patch-ингом, думаю, рассказывать вам не надо - нет никакой гарантии, что подмененные модули будут работать. Нет смысла говорить, что gevent внутри себя делает практически то же самое, что в twisted делается с помощью deferToThread - синхронное API нельзя «магически» превратить в асинхронное. И понятно, что подход, использованный в gevent не работает, если блокирующие вызовы производятся непосредственно в C-коде, т.е. нет того, что можно подменить.

Лучше, так лучше. Как говорится, ignorance is bliss.

shylent
()
Ответ на: комментарий от shylent

Про проблемы, возникающие с monkey-patch-ингом, думаю, рассказывать вам не надо

зачем monkey patching если можно сразу писать под gevent? Я патчингом не пользуюсь. Я нигде не предлагал подменять стандартные либы gevent.

что gevent внутри себя делает практически то же самое что в twisted делается с помощью deferToThread

deferToThread костыль, теряется вся прозрачность кода. Потом если у меня тыща соединений я в каждом вызову deferToThread то twisted 1000 тредов создаст? Фига се «практические то же самое».

Я думаю что на счёт устройства gevent ты не прав. Если и есть там треды то их там фиксированное количество. Лень лезть в сырцы чтобы выяснять это.

подход, использованный в gevent не работает, если блокирующие вызовы производятся непосредственно в C-коде

какие способы решения этой проблемы предлагает twisted?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

зачем monkey patching если можно сразу писать под gevent

Как вы сделаете вызов функции, которая, доспустим, делает блокирующий socket.read не подменяя модуля socket? gevent именно это и делает - подменяет некоторые стандартные модули.

deferToThread костыль, теряется вся прозрачность кода.

Напротив, в отличие от библиотек, «магическим образом» делающих синхронные вызовы асинхронными, deferToThread кристально четко дает понять, что вот только что мы какой-то там вызов сделали в отдельном треде.

Потом если у меня тыща соединений я в каждом вызову deferToThread то twisted 1000 тредов создаст? Фига се «практические то же самое».

Создаст количество тредов, соответствующее максимальному размеру тредпула, т.е. некое «фиксированное количество».

какие способы решения этой проблемы предлагает twisted?

twisted и С к этому никакого прямого отношения не имеют - эта проблема имеет ровно два решения, не в зависимости от используемого языка/технологии:

  • синхронное (блокирующее) API заменяется на асинхронное (неблокирующее) - либо как-то с помощью monkeypatching, либо просто используется другое API, либо переписывается, как-то так
  • блокирующие вызовы выполняются в отдельном треде/тредах или процессе/процессах (да, можно и так, в принципе) с тем, чтобы не блокировать весь event loop
shylent
()
Ответ на: комментарий от kiverattes

Наши люди есть всюду у python длинные руки:)

pylin ★★★★★
()
Ответ на: комментарий от shylent

gevent это не такой страшный костыль а грамотная реализация концепции зелёных нитей. Для удобства API взяли всем привычный и знакомый что в свою очередь дало возможность некоторые программы переводить на эту библиотеку с monkey patching. Нет тут никакой «магии».

Очевидно что подход применённый в gevent позволяет сильно упростить(по сравнению с тем же twisted) процесс работы с сокетами, очередями, ресолвером, синхронизацией итп сохранив при этом преимущества безтредовой архитектуры.

true_admin ★★★★★
()
Ответ на: комментарий от kiverattes

Чуваки, стоп, речь про С++ (-;

теперь уже поздно :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

gevent это не такой страшный костыль а грамотная реализация концепции зелёных нитей. Для удобства API взяли всем привычный и знакомый что в свою очередь дало возможность некоторые программы переводить на эту библиотеку с monkey patching. Нет тут никакой «магии».

Очевидно что подход применённый в gevent позволяет сильно упростить(по сравнению с тем же twisted) процесс работы с сокетами, очередями, ресолвером, синхронизацией итп сохранив при этом преимущества безтредовой архитектуры.

Да

shylent
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.