Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Препарирование работы асинхронного кода

Препарирование работы асинхронного кода

Alexander Koshelev

February 24, 2013
Tweet

More Decks by Alexander Koshelev

Other Decks in Programming

Transcript

  1. ЗАЧЕМ Asynchronous is a new cool Эффективность Много io-bound Мало

    cpu-bound Высокие нагрузки Много клиентов
  2. EVENT LOOP w h i l e r u n

    n i n g : d o _ h a n d l e _ s o c k e t s ( ) d o _ h a n d l e _ t i m e o u t s ( ) d o _ h a n d l e _ c a l l b a c k s ( )
  3. ЭТО ЗНАЧИТ Все запросы обрабатываются в одном процессе Обработка одного

    запроса влияет на другие Требуется изоляция контекста каждого запроса
  4. ЭКСПЕРИМЕНТ ХЕНДЛЕР c l a s s A p p

    H a n d l e r ( o b j e c t ) : @ g e n . e n g i n e d e f p r o c e s s ( s e l f , c a l l b a c k ) : y i e l d g e n . T a s k ( s e l f . d o _ i o ) s e l f . d o _ c p u ( ) r e s u l t s = y i e l d [ g e n . T a s k ( s e l f . d o _ b r a n c h ) , g e n . T a s k ( s e l f . d o _ b r a n c h ) ] s e l f . d o _ c p u ( ) y i e l d g e n . T a s k ( s e l f . d o _ i o ) s e l f . d o _ c p u ( ) c a l l b a c k ( ' o k ' )
  5. ЭКСПЕРИМЕНТ ХЕНДЛЕР c l a s s A p p

    H a n d l e r ( o b j e c t ) : # . . . d e f d o _ c p u ( s e l f , c y c l e s = 1 0 0 0 0 0 0 ) : f o r _ i n x r a n g e ( c y c l e s ) : p a s s @ g e n . e n g i n e d e f d o _ i o ( s e l f , c a l l b a c k ) : y i e l d g e n . T a s k ( s e l f . h t t p _ c l i e n t . f e t c h , ' h t t p : / / l o c a l h o s t : 5 0 0 1 / ' ) c a l l b a c k ( N o n e ) @ g e n . e n g i n e d e f d o _ b r a n c h ( s e l f , c a l l b a c k ) : y i e l d [ g e n . T a s k ( s e l f . d o _ i o ) f o r _ i n r a n g e ( 5 ) ] s e l f . d o _ c p u ( ) c a l l b a c k ( N o n e )
  6. ЭКСПЕРИМЕНТ ПРИЛОЖЕНИЕ f r o m t o r n

    a d o i m p o r t w e b f r o m h a n d l e r i m p o r t A p p H a n d l e r c l a s s R o o t H a n d l e r ( w e b . R e q u e s t H a n d l e r ) : @ w e b . a s y n c h r o n o u s d e f g e t ( s e l f ) : h a n d l e r = A p p H a n d l e r ( ) h a n d l e r . p r o c e s s ( s e l f . r e t u r n _ r e s p o n s e ) d e f r e t u r n _ r e s p o n s e ( s e l f , r e s p o n s e ) : s e l f . f i n i s h ( r e s p o n s e ) a p p l i c a t i o n = w e b . A p p l i c a t i o n ( [ ( r ' / ' , R o o t H a n d l e r ) , ] )
  7. WORKAROUND FLASK + TORNADO IOLOOP Синхронный воркер Не жадный Но

    нужно несколько процессов Event loop внутри Параллельный опрос бекэндов
  8. FLASK + TORNADO IOLOOP РЕАКТОР d e f d o

    ( h a n d l e r , a r g s = ( ) , k w a r g s = { } ) : i o _ l o o p = t o r n a d o . i o l o o p . I O L o o p . i n s t a n c e ( ) r e s u l t = [ N o n e ] d e f c a l l b a c k ( r e s u l t _ ) : r e s u l t [ 0 ] = r e s u l t _ i o _ l o o p . s t o p ( ) k w a r g s [ ' c a l l b a c k ' ] = c a l l b a c k h a n d l e r ( * a r g s , * * k w a r g s ) i o _ l o o p . s t a r t ( ) r e t u r n r e s u l t [ 0 ]
  9. FLASK + TORNADO IOLOOP ПРИЛОЖЕНИЕ f r o m f

    l a s k i m p o r t F l a s k i m p o r t h a n d l e r , r e a c t o r a p p l i c a t i o n = F l a s k ( _ _ n a m e _ _ ) @ a p p l i c a t i o n . r o u t e ( ' / ' ) d e f r o o t ( ) : h n d l = h a n d l e r . A p p H a n d l e r ( ) r e s p o n s e = r e a c t o r . d o ( h n d l . p r o c e s s ) r e t u r n r e s p o n s e