2016-01-11 4 views
3

Поэтому у меня есть некоторый код, который функционирует что-то вроде этого общего кода:google app engine - Асинхронные блоки кода? питон

for blah in blahs: 
    blah.take_forever() 

for blah2 in blah2s: 
    vars = blah2.take_forever() 
    for var in vars: 
    var.also_take_forever() 

Я хочу что-то, что такие функции, как в асинхронном, такие как

async_start_blah2_loop_then_do_someting_else() 

do_the_first_blah_loop() 

gather_results_and_send_them_out() 

Однако, я не с помощью хранилищу или urlfetch для этого, так что другие варианты ускорят этот процесс?

"

map_async(callback, pass_batch_into_callback=None, merge_future=None, **q_options) 
Asynchronously map a callback function or tasklet over the query results. This is the asynchronous version of map(). 

"

, кажется, относятся только к DATASTORE запросов.

Предложения?

+1

многопоточности и/или асинхронных операций только поможет, когда ваши ожидания на какой-либо другой сервис, который занимает много времени. Если все ориентировано на вычисления, вы ничего не выиграете. Одним из подходов может быть разбиение каждой операции «take_for_ever» на отдельные дискретные вызовы для инфраструктуры приложений. Пусть передняя часть сделает запросы, и вы можете ударить по нескольким экземплярам. –

+0

@ Тит, да, я попробовал потоки, и это связано с тем, что другой сервис занимает время, противоположное вычислениям (но не службе движка приложения). Сейчас angularjs делает сообщение ajax на моем сервере, которое содержит код, который занимает некоторое время. Однако вчера вечером я подумал, что могу попытаться использовать службу очереди с помощью angularjs и поместить две функции на двух разных обработчиках, чтобы обе функции возвращались с результатами, когда они были закончены, вместо ожидания на другом. –

ответ

2

Вы можете использовать собственный модуль threading Python в App Engine для асинхронного выполнения функций (см. threading.Thread). Это также отлично работает на автоматических масштабированных экземплярах, поскольку использует «зеленые» потоки вместо потоков ОС.

def blahFunc(): 
    for blah in blahs: 
    blah.take_forever() 

def blah2Func(): 
    for blah2 in blah2s: 
    vars = blah2.take_forever() 
    for var in vars: 
     var.also_take_forever() 

# Execute both loops 'at the same time' 
background = threading.Thread(target=blah2Func) 
background.start() 
blah1Func() 

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

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

+0

Код мля находится внутри четкости поста (сам) .. Мне нужен ответ на функцию поста передать обратно в angularjs, который сделал АЯКС вызов на пост, чтобы изменить переменные $ области действия ... Дон» t I? Я не совсем уверен, как это работает, если я использую очередь задач. Я новичок в angularjs. Это возможно? После всего, что запутанная формулировка, я имею в виду, возможно ли использовать очередь задач для обновления переменных $ scope на странице html? –

+0

, поэтому я попробовал нить. Вы правы, полагая, что мне пришлось вызвать background.join(), потребовалось примерно столько же времени, как и первая функция, вторая медленная. –

+0

В вашем случае, так как вы полагаетесь на результат на стороне клиента, делайте что-то асинхронным на бэкэнд не будет предоставлять никакой чистой выгоды (так что очереди задач также будут отсутствовать). Асинхронная часть должна выполняться на стороне клиента в виде вызова ajax. Если вы блокируете результаты вызова ajax, это будет время, чтобы пересмотреть ваш дизайн, поскольку это побеждает точку «асинхронного» в ajax. – Adam

Смежные вопросы