(Примечание: этот вопрос строго о дизайн API, не о том, как реализовать его; т.е. Я только забочусь о том, что клиент моего API видит здесь, не, что я должен сделать, чтобы заставить его работать.)
Простыми словами: Я хочу знать установленный образец - если любой - для явные фьючерсы (иначе обещания, иначе deferreds, иначе задачи - имена варьируются в зависимости от рамки) в Python. Следующее является более подробным описанием.
Считают простой Python API как это:
def read_line():
...
s = read_line()
print(s)
Это - синхронная версия - она заблокируется, если строка еще не будет доступна. Предположим, теперь, что я хочу обеспечить соответствие, асинхронное (неблокирование) версия, которая позволяет регистрировать обратный вызов, который будет вызван, после того как операция завершается. Например, простая версия могла быть похожей на это:
def read_line_async(callback):
...
read_line_async(lambda s: print(s))
Теперь, на других языках и рамках, часто существуют существующие переданные под мандат или по крайней мере известные узоры для таких API. Например, в.NET до версии 4, можно было бы обычно обеспечивать пару BeginReadLine
/ методы EndReadLine
и использовала бы запас интерфейс IAsyncResult
, чтобы зарегистрировать обратные вызовы и передать получающиеся значения. В.NET 4 +, каждый использует Система. Поточная обработка. Задачи
, чтобы включить все операторы объединения задачи ( WhenAll
и т.д.), и поднять трубку в C# 5.0 , асинхронный
функция.
Для другого примера, в JavaScript, нет ничего для покрытия этого в стандартной библиотеке, но jQuery популяризировал "задержанное обещание" интерфейс, который является теперь , отдельно указал . Таким образом, если бы я должен был записать асинхронный readLine
в JS, то я назвал бы его readLineAsync
и реализация затем
метод на возвращенном значении.
, Что, если таковые имеются, установленный образец на земле Python? Просматривая стандартную библиотеку, я вижу, что несколько модулей предлагают асинхронные API, но никакой последовательный образец между ними и ничем как стандартизированный протокол для "задач" или "обещаний". Возможно, существует некоторый образец, который может быть получен из популярных сторонних библиотек?
я также видел (часто упомянутый в этом контексте) Задержанный класс в Скрученном, но это, кажется, сверхспроектировано для обещания общего назначения API и скорее адаптировано к определенным потребностям этой библиотеки. Это не похоже на что-то, что я мог легко клонировать интерфейс для (не беря зависимость от них) таким образом, что наши обещания будут взаимодействовать хорошо, если клиент будет пользоваться обеими библиотеками вместе в его заявлении. Есть ли какая-либо другая популярная библиотека или рамка, которая имеет явно разработанный API для этого, которое я мог скопировать (и взаимодействовать с), не беря прямую зависимость?
-121-1091463-
я пытаюсь назвать что-то каждые 3 месяца (ежеквартально) в Quartz.NET (использующий и стабильную и последнюю версию 2, которая является бета-версией с теми же результатами).
я создаю триггер крона с 0 30 8 3 */3? *
, чтобы быть названным каждые 3 месяца в 8:30 на трети месяца это происходит.
Так технически начиная с 2 сентября сегодня я ожидал бы, что это инициирует завтра. Однако это время следующего запуска показывает как являющийся в следующем месяце. Почему то, что так?
Обновленный: Согласно ответам, которые я создал, я в соответствии с методом - мог быть полезен для кого-то:
public static string CalculateMonthsWithInterval(int startMonth, int interval)
{
var months = new List();
var monthNames = new [] {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
var monthSelector = startMonth % interval;
for (var i = 0; i < 12; i++)
{
if (i % interval == monthSelector)
{
months.Add(monthNames[i]);
}
}
return string.Join(",", months.ToArray());
}
пз: Я не использовал индексы в течение многих месяцев, потому что по некоторым причинам это не работало хорошо с моим Кварцем (v2 БЕТА-ВЕРСИЯ). Также его более легкое для чтения на уровне DB.
вызов В качестве примера - Каждые 3 месяца на основе startDate:
var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3);