POSIX библиотека AIO и обработчики обратного вызова

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

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

, Но позволяют мне сказать Вам, я понимаю, насколько трудный это. Я работал в нашем магазине консультирования много лет, начиная с поддержки, и теперь я являюсь главным образом руководящим другие консультанты и разработка. Существует много клиентов (как сотни), кто чувствует, что они имеют личные отношения со мной и предполагают, что могут позвонить мне непосредственно даже после лет и лет.

Моя подсказка должна удостовериться, что у Вас есть хорошая сеть консультантов и supportworkers, кто может помочь клиенту для Вас, и сделать, чтобы они связались с Вами вместо этого, если они не могут понять его.

6
задан 2 August 2009 в 21:26
поделиться

2 ответа

Один из подходов - использовать SIGEV_SIGNAL с сигналом в реальном времени для «переноса» "готовый файловый дескриптор для обработчика сигнала. Очередь сигналов в реальном времени и обработчики сигналов выполняются асинхронно в одном потоке, поэтому этот подход более или менее функционально эквивалентен SIGEV_CALLBACK :

/*
 * Warning!  Untested!
 * Also, safe initialization, per-thread signal masking and
 * error-checking omitted.
 */

static void my_callback(int sig, siginfo_t *info, void *context) {
  int fd;

  fd = info->si_value.sival_int;
  /* ...enqueue the fd for processing... */
}

struct sigaction sa;

sa.sa_handler = my_callback;                 /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...

struct aiocb ac;

ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo  = SIGRTMIN+1;   /* Associate callback w. aiocb */
....
aio_read(&ac);

Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd своему вспомогательному пулу потоков. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL , когда SIGEV_CALLBACK недоступен.

Очередь сигналов в реальном времени и обработчики сигналов выполняются асинхронно в одном потоке, поэтому этот подход более или менее функционально эквивалентен SIGEV_CALLBACK :

/*
 * Warning!  Untested!
 * Also, safe initialization, per-thread signal masking and
 * error-checking omitted.
 */

static void my_callback(int sig, siginfo_t *info, void *context) {
  int fd;

  fd = info->si_value.sival_int;
  /* ...enqueue the fd for processing... */
}

struct sigaction sa;

sa.sa_handler = my_callback;                 /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...

struct aiocb ac;

ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo  = SIGRTMIN+1;   /* Associate callback w. aiocb */
....
aio_read(&ac);

Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd в пул потоков-помощников. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL , когда SIGEV_CALLBACK недоступен.

Очередь сигналов в реальном времени и обработчики сигналов выполняются асинхронно в одном потоке, поэтому этот подход более или менее функционально эквивалентен SIGEV_CALLBACK :

/*
 * Warning!  Untested!
 * Also, safe initialization, per-thread signal masking and
 * error-checking omitted.
 */

static void my_callback(int sig, siginfo_t *info, void *context) {
  int fd;

  fd = info->si_value.sival_int;
  /* ...enqueue the fd for processing... */
}

struct sigaction sa;

sa.sa_handler = my_callback;                 /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...

struct aiocb ac;

ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo  = SIGRTMIN+1;   /* Associate callback w. aiocb */
....
aio_read(&ac);

Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd в пул потоков-помощников. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL , когда SIGEV_CALLBACK недоступен.

1
ответ дан 17 December 2019 в 18:18
поделиться

Существует известная проблема с Rails 3.1.1, которая нарушает эту функциональность. Если у вас возникла эта проблема, попробуйте сначала выполнить обновление, она исправлена ​​в версии 3.1.2

Вы так близко. Проблема в том, что вы неправильно используете параметр: source. : source должен указывать на полиморфное отношение own_to. Затем все, что вам нужно сделать, это указать: source_type для отношения, которое вы пытаетесь определить.

Это исправление модели Widget должно позволить вам делать именно то, что вы ищете.

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

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