Каков лучший механизм IPC для данных среднего размера в Perl? [закрытый]

OrientationEventlistener не будет работать, когда устройство не вращается / движется.

Я считаю, что прослушивание экрана - лучший способ обнаружить изменение.

 DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {
    @Override
    public void onDisplayAdded(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " added.");
    }

    @Override
    public void onDisplayChanged(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " changed.");
    }

    @Override
    public void onDisplayRemoved(int displayId) {
       android.util.Log.i(TAG, "Display #" + displayId + " removed.");
    }
 };
 DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);
 displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler);

onDisplayChanged срабатывает только в точности при изменении getRotation (). OrientationEventListener, с другой стороны, постоянно запускается в реальном времени и даже до изменения getRotation (), что приводит к совершенно неправильным значениям поворота экрана при повороте на 180 ° с перспективы.

7
задан Community 23 May 2017 в 10:27
поделиться

6 ответов

Временные файлы (и связанные вещи, как регион общей памяти), вероятно, проигранное пари. Если Вы когда-нибудь захотите выполнить свой сервер на одной машине и свои клиенты на другом, то необходимо будет переписать приложение. При выборе какой-либо из других опций по крайней мере, семантика по существу то же, если необходимо переключиться между ними позднее.

Мой единственный реальный совет, тем не менее, не состоит в том, чтобы записать это самостоятельно. На стороне сервера необходимо использовать POE (или Коро, и т.д.), вместо выполнения select на сокете самостоятельно. Кроме того, если Ваш интерфейс будет выходом RPC, используйте что-то как JSON-RPC-Common/от CPAN.

Наконец, существует IPC:: PubSub, который мог бы работать на Вас.

4
ответ дан 6 December 2019 в 08:46
поделиться

Если Вы не уверены в своих строгих требованиях в данный момент, попытайтесь думать о простом интерфейсе, к которому можно кодировать, что любая реализация IPC (это временные файлы, TCP/IP или безотносительно) должна поддерживать. Можно затем выбрать конкретный аромат IPC (я запустил бы с того, что является самым легким и/или самым легким отладить - вероятно, временные файлы), и реализуйте интерфейс с помощью этого. Если это оказывается слишком медленным, реализуйте интерфейсное использование, например, TCP/IP. На самом деле реализация интерфейса не включает много работы, поскольку Вы будете по существу просто переводить вызовы к некоторой существующей библиотеке.

Дело в том, что у Вас есть высокоуровневая задача работать ("данные передачи от программы A до программы B"), который более или менее независим от деталей того, как это выполняется. Путем установления интерфейса и кодирования к нему, Вы изолируете основную программу от изменений, если необходимо изменить реализацию.

Обратите внимание, что Вы не должны использовать тяжелые механизмы языка Perl для превращения в капитал из идеи наличия интерфейса. Вы могли просто иметь, например, 3 различных пакета (для временных файлов, TCP/IP, сокетов домена Unix), каждый из которых экспортирует тот же набор методов. Выбор, какую реализацию Вы хотите использовать в своей основной программе, составляет выбор который модуль к use.

6
ответ дан 6 December 2019 в 08:46
поделиться

Сокеты домена UNIX являются портативными через нельды. Это не менее портативное, чем каналы. Это также более эффективно, чем сокеты IP.

Так или иначе Вы пропустили несколько опций, общая память, например. Некоторые добавили бы базы данных к тому списку, но я скажу, что это - довольно тяжелое решение.

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

Я обычно соглашаюсь, хотя то использование существующего решения лучше, чем создание собственных somethings. Я не знаю специфических особенностей Вашей проблемы, но я предположил бы, что Вы проверите раздел IPC CPAN

3
ответ дан 6 December 2019 в 08:46
поделиться

Временные файлы имеют другие проблемы помимо этого. Я думаю, что интернет-носки являются действительно лучшим выбором. Они хорошо документируются, и как Вы говорите, масштабируемый и портативный. Даже если это не базовое требование, Вы получаете его почти бесплатно. Сокеты довольно легки иметь дело с, снова существуют обильные суммы документации. Можно пристроить механизм совместного использования данных и протокол в библиотеке и никогда не иметь для рассмотрения его снова!

4
ответ дан 6 December 2019 в 08:46
поделиться

Существует столько различных вариантов, потому что большинство из них лучше для некоторого особого случая, но Вы действительно не дали информации, которая определила бы Ваш случай.

Читатели/устройства записи в непосредственных отношениях, или что-то более более сложное? Что Вы хотите произойти с устройством записи, если читатель больше не там или занят? И наоборот? Что другую информацию Вы имеете о своем желаемом использовании?

2
ответ дан 6 December 2019 в 08:46
поделиться

Для "интерактивных" запросов (содержащий соединение открываются при ожидании ответа (асинхронно или не): HTTP + JSON. JSON:: XS безумно быстр. Все и все могут говорить HTTP, и легко загрузить баланс, отладку...

Для запросов с очередями ("сделайте это, Спасибо!"): Beanstalkd и Beanstalk:: Клиент. Сериализируйте запросы в очереди бобового стебля с JSON.

Экономию могло бы также стоить изучить в зависимости от Вашего приложения.

2
ответ дан 6 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: