Поставить программу на паузу

Упрощенно:
Есть golang приложение, которое по http получает данные с внешнего сервера раз в секунду, как-то их обрабатывает и отправляет назад.

Если при получении данных сервер возвращает код 500, то необходимо поставить «приложение на паузу»: перестать обрабатывать уже полученные данные и отсылать обработанные назад на сервер (технически это будет значить очистку буферизованных каналов и данных, которые уже крутятся внутри приложения).

Как только ответ от сервера приходит 200 — снова все продолжает работать.

Подскажите, пожалуйста, ссылки с примерами, как лучше управлять таким как бы глобальным состоянием приложения.

  • Вопрос задан более года назад
  • 208 просмотров

1 комментарий

Средний 1 комментарий

Что значит «как только ответ приходит 200»?
Если приложение после 500 ответа перестает обрабатывать данные, значит оно перестает и посылать запросы на сервер. Как тогда оно может получить 200 без запроса?

Как при записи видео на АЙФОНЕ поставить ПАУЗУ! Самый легкий и 100% рабочий способ — Проблема Решена

А вообще задача напоминает больше обработку очереди сообщений. Лучше бы это делать на на HTTP-запросах, а на чем-то предназначенном для очередей — та же Kafka, RabbitMQ и подобных.

Решения вопроса 0
Ответы на вопрос 3

Vindicar

Ни разу не писал на Go, но могу задать умный вопрос насчёт архитектуры. =)

Как только ответ от сервера приходит 200 — снова все продолжает работать.

То есть приложение должно продолжать работать, как минимум в плане отправки запросов к серверу! Иначе как оно узнает, что можно работать дальше?

Далее, если я правильно понимаю, что ты в цикле крутишь примерно следующий псевдокод?

while (true)

Тогда почему не заставить query_server() сообщать об успешности запроса так или иначе?
А далее, если запрос был успешен, выполнять следующие два шага.

Ответ написан более года назад
Комментировать
Нравится Комментировать

Читайте также:
Требуется написать программу определяющую является ли четырехзначное

2ord

Неправильно как-то все это.
Если есть запрос, значит, и соединение. Пока ответ не отдан, веб-сервер должен держать соединение. А если ответ не возвращается, то клиент ждет, пока соединение не отвалится по таймауту. Так что эта техника довольно затратна с точки зрения ресурсов, которые могут быть исчерпаны. Особенно, при наличии достаточно большого количества клиентов.
Ну а так, ошибка 500 может означать и логическую, и ошибку соединения с СУБД, и что какой-то ресурс 3-й стороны недоступен, и многое другое. Так что если логическая, то сервер не «исправится» и, при этом, не выйдет из спячки, если будет ждать ответа 200.
Ну а так, блокировать выполнение можно при помощи каналов (channel). Но практический смысл в этом не вижу.

Ответ написан более года назад
Комментировать
Нравится Комментировать
Попробуй так

Как поставить программу на паузу, и как продолжить с паузы

switch request.StatusCode
Ответ написан более года назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

go

  • Go

Как решить проблему X does not implement Y при работе с интерфесами?

  • 3 подписчика
  • 07 июл.
  • 101 просмотр

Источник: qna.habr.com

Thread. Sleep Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Приостанавливает текущий поток на заданное время.

Перегрузки

Приостанавливает текущий поток на заданное количество миллисекунд.

Приостанавливает текущий поток на заданное время.

Sleep(Int32)

Приостанавливает текущий поток на заданное количество миллисекунд.

public: static void Sleep(int millisecondsTimeout);
public static void Sleep (int millisecondsTimeout);
static member Sleep : int -> unit
Public Shared Sub Sleep (millisecondsTimeout As Integer)

Параметры

millisecondsTimeout Int32

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

Читайте также:
Как взломать программу adguard

Исключения

Значение времени ожидания является отрицательной величиной и не равно Infinite.

Примеры

В следующем примере метод используется для Sleep блокировки основного потока приложения.

using namespace System; using namespace System::Threading; int main() < for (int i = 0; i < 5; i++) < Console::WriteLine(«Sleep for 2 seconds.»); Thread::Sleep(2000); >Console::WriteLine(«Main thread exits.»); > /* This example produces the following output: Sleep for 2 seconds. Sleep for 2 seconds. Sleep for 2 seconds. Sleep for 2 seconds. Sleep for 2 seconds.

Main thread exits. */
using System; using System.Threading; class Example < static void Main() < for (int i = 0; i < 5; i++) < Console.WriteLine(«Sleep for 2 seconds.»); Thread.Sleep(2000); >Console.WriteLine(«Main thread exits.»); > > /* This example produces the following output: Sleep for 2 seconds. Sleep for 2 seconds. Sleep for 2 seconds. Sleep for 2 seconds.

Sleep for 2 seconds. Main thread exits. */
Imports System.Threading Class Example Shared Sub Main() For i As Integer = 0 To 4 Console.WriteLine(«Sleep for 2 seconds.») Thread.Sleep(2000) Next Console.WriteLine(«Main thread exits.») End Sub End Class ‘ This example produces the following output: ‘ ‘Sleep for 2 seconds. ‘Sleep for 2 seconds. ‘Sleep for 2 seconds. ‘Sleep for 2 seconds. ‘Sleep for 2 seconds. ‘Main thread exits.

Комментарии

Выполнение потока операционной системой не будет запланировано на указанный период времени.

Этот метод изменяет состояние потока, включив в него WaitSleepJoin.

Можно указать Timeout.Infinite для millisecondsTimeout параметра приостановку потока на неопределенный срок. Однако вместо этого рекомендуется использовать другие System.Threading классы, такие как Mutex, Monitor, EventWaitHandleили Semaphore , для синхронизации потоков или управления ресурсами.

Системные часы тикают с определенной скоростью, называемой разрешением часов. Фактическое время ожидания может не совпадать с заданным временем ожидания, так как указанное время ожидания будет скорректировано так, чтобы совпадать с тактами часов. Дополнительные сведения о разрешении часов и времени ожидания см. в разделе Функция спящего режима из системных API Windows.

Этот метод не выполняет стандартную перекачку COM и SendMessage.

Если необходимо выполнить спящий режим в потоке с STAThreadAttribute, но вы хотите выполнить стандартную накачку COM и SendMessage, рассмотрите возможность использования одной из перегрузок Join метода, который задает интервал времени ожидания.

Читайте также:
Каково содержание понятия имре лакатоса исследовательская программа

Источник: learn.microsoft.com

Как в терминале поставить вывод на паузу

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

В этой небольшой заметке я расскажу, как поставить программу командной строки на паузу в Linux.

Примером программы, часто обновляющей информацию на экране, является i7z или top:

Чтобы приостановить выполнение программы, используйте сочетание клавиш CTRL+s, а чтобы продолжить работу программы и возобновить обновление экрана, нажмите CTRL+q (это называется. XON/XOFF).

Другой способ подходит для программ, которые последовательно выводят много строк на экран (а не обновляют содержимое экрана). Для таких случаев можно использовать less или аналогичную программу, которая делит вывод на страницы:

strace date | less

Чтобы выйти из less, нажмите клавишу q.

И ещё один вариант, также для программ, показывающим много строк, это перенаправление вывода в файл. То есть сохранение полученных данных в файл для последующего его изучения. Сохранить в файл можно как используя конструкцию со strace:

strace -o foo date

Либо с помощью встроенной опции в программу или используя символ перенаправления вывода >> (для замены содержимого файла используйте >, а для добавления к существующему содержимому >>):

man date >> curdate.txt

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

Связанные статьи:

  • Как использовать echo вместе с sudo (75%)
  • Мы скоро начнём (50%)
  • Как установить Kingsoft Office на Linux (50%)
  • Как установить .deb файл с зависимостями (50%)
  • Как переименовать группу файлов (50%)
  • Решение проблемы с ошибкой fatal error: libnfnetlink/linux_nfnetlink.h: Нет такого файла или каталога (RANDOM — 50%)

Источник: zalinux.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru