Twisted: Делаем код неблокирующим

Я немного озадачен тем, как писать асинхронный код на python / twisted. Предположим (ради аргументов), что я показываю миру функцию, которая будет принимать число и возвращать True / False, если оно простое / непростое, поэтому это выглядит примерно так:


def IsPrime(numberin):
    for n in range(2,numberin):
        if numberin % n == 0: return(False)
    return(True)

(просто для иллюстрации).

Теперь предположим, что есть веб-сервер, которому необходимо вызвать IsPrime на основе отправленного значения. Это займет много времени для большого числа в .

Если тем временем другой пользователь запрашивает первичность небольшого числа, есть ли способ выполнить два вызова функций асинхронно с использованием архитектуры реактора / отложенных вычислений, чтобы результат короткого вычисления возвращался раньше, чем результат длинный расчет?

Я понимаю, как это сделать, если функциональность IsPrime поступает с какого-то другого веб-сервера, на который мой веб-сервер будет выполнять отложенный getPage, но что, если это просто локальная функция?

т.е. может Twisted каким-то образом разделить время между двумя вызовами IsPrime, или для этого потребуется явный вызов нового потока?

Или, нужно ли разбить цикл IsPrime на несколько более мелких, чтобы управление можно было быстро передать обратно реактору?

Или что-то еще?

19
задан acrophobia 24 May 2011 в 22:16
поделиться