Разработка асинхронного API в Python

(Примечание: этот вопрос строго о дизайн 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 месяца я пытаюсь назвать что-то каждые 3 месяца (ежеквартально) в Quartz.NET (использующий и стабильную и последнюю версию 2, которая является бета-версией с теми же результатами). Я создаю триггер крона с 0 30 8 3 */3? *, чтобы быть...

я пытаюсь назвать что-то каждые 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);

5
задан Luke 4 September 2011 в 22:29
поделиться