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

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

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

Avatar for Alexander Koshelev

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