Задержка с целлулоидом ZMQ вызывает проблемы с данными
Пример кода, чтобы объяснить мою проблему.
Отправитель, который отправляет запрос на Сервер (через ZMQ) в формате
["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]
..
["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]
Сервер после получения данных от отправителя возвращает их получателю в том же формате.
["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]
...
["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]
Получатель, получив запрос от Сервера, просто распечатывает сообщение.
Описание:
Если я не использую mutex
определяется в этой строке(внутри сервера). Я вижу некоторые данные, появляющиеся на стороне получателя, которые не соответствуют вышеуказанному формату / стандарту.
Пример, который сервер напечатает (в этой строке)
"Sending sender-97 -- sender-97-9a284488454c8e8fd22bbbcf678895e9"
"Sending sender-98 -- sender-98-447eb5be94e7f6d949e764d7c88239ad"
Но на стороне получателя я вижу сообщения, которые выглядят так.
sender-97 -- sender-98
sender-98-22d9f01a8f801f559a9ff4e388813251 --
Вопрос:
На мой взгляд, это похоже на возможную проблему в теме (я могу ошибаться). При этом данные, которые передаются (внутри сервера) Celluloid ( отправка), изменяются другим потоком.
У меня сложилось впечатление, что Celluloid решает почти все ваши проблемы.
Правильно ли мое понимание всего этого?
1 ответ
Вам нужен асинхронный регистратор.
Всякий раз, когда вы используете puts
вы выводите в буфер, который на самом деле очень медленный, по сравнению с другими вещами. То, что вы должны сделать, это использовать актер, используемый исключительно вместо puts
везде.
Лучше всего было бы создать экземпляр контролируемого актера, скажем, по имени :logger
а затем взаимодействовать с ним внутри других ваших актеров Celluloid[:logger].async.ouput()
или вперед output
в Celluloid[:logger].async
так что каждый раз, когда вы используете output
или же console
или что-то в этом роде asynchronous
вызов метода. Таким образом, даже если ваш актер, выполняющий работу, переходит к чему-то другому, вывод консоли все равно будет в идеальной последовательности.
Вывод вашей консоли искажается из-за вышеуказанной проблемы с асинхронностью в самом программировании, а не Celluloid
... и это чрезвычайно распространенная проблема с и без ZeroMQ
,
да defer
нарушает последовательность вашего Receiver
выходной, но нет это не Thread
ошибка в Celluloid
, Это естественное поведение асинхронных операций. В этом случае вам нужно удалить defer {}
и хранить async.received_data()
как у тебя
В противном случае, как вы видите, Server
будет бомбардировать Receiver
с сообщениями из последовательности. Также не помогает то, что вы напрямую управляете потоками поверх всего этого, а не позволяете Celluloid::ZMQ
сделай это для тебя.
Также: я бы удалил все "внешние" потоки управления и удалил defer {}
обертка... и пусть Celluloid::ZMQ
сгладить все и сохранить последовательность для вас.