Android: диспетчер аварийных сигналов: установите повторяющийся сигнал триггеров, если установленное время уже прошло [дубликат]

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

Используйте источник данных за пределами флажка для хранения глобальных данных. База данных, memcached или redis - все соответствующие области хранения, в зависимости от ваших потребностей. Если вам нужно загрузить и получить доступ к данным Python, рассмотрите multiprocessing.Manager . Вы также можете использовать сеанс для простых данных, предназначенных для каждого пользователя.


Сервер разработки - это единственный поток, по умолчанию один процесс. Вы не увидите поведение, которое вы описываете, поскольку каждый запрос будет обрабатываться синхронно. Включите потоки или процессы, и вы увидите это. app.run(threaded=True) или app.run(processes=10).


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

7
задан Flame of udun 10 April 2016 в 21:52
поделиться

1 ответ

Вам не нужно создавать Timestamp s. Вы можете сделать это с помощью Calendar.

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);

if(calendar.before(Calendar.getInstance())) {
    calendar.add(Calendar.DATE, 1);
}

alarmManager.set(AlarmManager.RTC_WAKEUP,
    calendar.getTimeInMillis(), pendingDinnerIntent);

Я бы также упомянул, что с KitKat, если ваш targetSdkVersion равен 19 или выше, метод AlarmManager#set() не является точным. Если вы хотите, чтобы ваш будильник срабатывал в определенное время, вам нужно использовать метод setExact*().

19
ответ дан Mike M. 28 August 2018 в 07:24
поделиться
Другие вопросы по тегам:

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