Все операции с портами в Rebol 3 асинхронны. Единственный способ синхронного общения, который я могу найти, - это позвонить wait
.
Но проблема с вызовом wait в этом случае заключается в том, что он будет проверять события для всех открытых портов (даже если они не находятся в блоке портов, переданном для ожидания). Затем они вызывают свои отвечающие обработчики событий, но чтение / запись могут выполняться в одном из этих обработчиков событий. Это может привести к рекурсивным вызовам «ожидания».
Как мне обойти это?
asynchronous
io
rebol
rebol3
Шисинь Цзэн
источник
источник
Ответы:
Почему бы вам не создать своего рода функцию «Буфера», чтобы получать все сообщения от синхронных записей и обрабатывать их как FIFO (first-in, first-out)?
Таким образом, вы можете сохранить характеристики Assync ваших портов и обработать их в режиме синхронизации.
источник
в случаях, когда есть только асинхронные события, и нам нужен синхронный ответ, запустите таймер или спящий режим для тайм-аута, если обработчик или требуемая цель достигнута, тогда скажите true, иначе false и убедитесь, что событие отменено / сброшено для то же самое, если критично.
источник
Я думаю, что есть 2 проблемы с дизайном (возможно, присущие имеющимся инструментам / решениям).
Wait
делает слишком много -it will check events for all open ports
. В здоровой среде ожидание должно реализовываться только там, где это необходимо: на устройство, на порт, на сокет ... Создание ненужных взаимозависимостей между общими ресурсами не может закончиться хорошо, особенно зная, что общие ресурсы (даже без взаимозависимостей) может создать много проблем.Обработчики событий могут делать слишком много. Обработчик событий должен быть как можно короче и обрабатывать только событие. Если он делает больше, значит, обработчик делает слишком много, особенно если задействует другие общие ресурсы. Во многих ситуациях обработчик просто сохраняет данные, которые в противном случае будут потеряны; а асинхронная работа будет делать более сложные вещи.
источник
Вы можете просто использовать замок. Cummunication1 может установить некоторое состояние глобальной блокировки, то есть с помощью переменной (убедитесь, что это потокобезопасно).
locked = true
. Тогда Communication2 может подождать, пока он не разблокируется.источник