• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Pthreads
 

Pthreads

on

  • 294 views

Apresentação da palestra de Pthreads na PHP Conference 2013

Apresentação da palestra de Pthreads na PHP Conference 2013

Statistics

Views

Total Views
294
Views on SlideShare
294
Embed Views
0

Actions

Likes
2
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Pthreads Pthreads Presentation Transcript

    • Conhecendo pthreads em PHP (nativo!)
    • Jonathan Garcia Lima Desenvolvedor PHP desde 2008 ZCE PHP 5.3 desde 2011 Apaixonado por desafios e novidades Analista Programador no SaveMe, uma empresa do grupo Buscapé Company
    • O conceito de Thread ● Linha ou Encadeamento de execução ● Procedimento que roda independentemente do programa principal ● Processo != Thread
    • Porque Pthread? ● Não é de PHP Threads! ● É de POSIX Threads! ● ● Padronização gera facilidade de entendimento, qualidade e facilidade. Todo mundo falando a mesma coisa de forma parecida, independentemente da linguagem. API orientada a objetos para criar e manipular threads!
    • O que é POSIX? É de comer? ● ● ● ● Portable Operating System Interface: Interface Portável entre Sistemas Operacionais Normas definidas pelo IEEE (Instituto de Engenheiros Eletricistas e Eletrônicos) Padrão com série de regras que determinam como deve ser um código-fonte ou SO para que ele possa ser portável entre SOs baseados no Unix Alternativas p/ Windows: Cygwin, Microsoft POSIX subsystem, Interix...
    • Afinal, para que usar threads? ● ● Executar mais de uma atividade ao mesmo tempo Acelerar processamento durante requisições http e batch (crons, processamento em background e afins) Processamento mais rápido por fazer mil coisas ao mesmo tempo
    • Tendências de infra e mercado ● Processadores cada vez mais potentes e com mais núcleos ● Placas mãe com múltiplos processadores ● Informações cada vez mais complexas, mais extensas e maiores (big data, por exemplo) → Evoluçã o Processadores com múltiplos núcleos mas executando tarefas sequenciais ← Big
    • 4 slots de processadores e 8 slots de memória compartilhada entre os 4
    • 16 núcleos 12gb de ram Potente?
    • 128 núcleos e 882gb... é cluster virtualizado, mas a idéia ainda assim é a mesma
    • O que eu preciso para utilizar pthreads? ● PHP ZTS (Zend Thread Safe) 5.3 ou superior ● ● ● ZTS: Zend Thread Safety, Segurança de Thread do Zend (o engine, dentro do PHP, não o Framework!) Módulo pthreads via PECL Atenção: A segurança de leitura e gravação de dados dentro das threads é somente garantida internamente no PHP (em seu acesso a classes, método s e propriedades, por exemplo), portanto para manter a integridade dos dados na sua aplicação, FAÇA VOCÊ MESMO!
    • Instalação modo MacGyver (Não recomendado!) ● Clone do repositório do PHP e do pthreads dentro da pasta ext do repositório do php, rodar um configure (com outros parâmetros, caso queira mais módulos): ● ● ● ● ● P/ gerar arquivo .dll ou .so: ./configure --enable-pthreads --enablemaintainer-zts Integrado na linguagem: ./configure --enable-pthreads=static --enable-maintainer-zts Somente com ZTS: ./configure --enable-maintainer-zts e rode um “pecl install pthreads” após o final de todos os passos make make install (Atenção: Isto substituirá toda instalação do PHP no seu sistema operacional! É recomendado não executar o make install, somente o make e rodar o php com os binários gerados no próprio repositório)
    • Conheça o PhpBrew! ● O super herói das instalações de PHP ● Gerencia múltiplas instalações do PHP na mesma máquina ● Troca de versão com facilidade ● Instalação global ou por usuário ● ● ● ● Vai e volta da instalação padrão do sistema ou do phpbrew com facilidade Gerencia a instalação de extensões com PECL e PEAR para cada versão instalada Separa as configurações por versões instaladas Problemas c/ “intl” no 5.3+ no Mac OS X, não roda no Windows e não gerencia dependências de compilação
    • Instalação via PhpBrew ● ● ● ● Tutorial de instalação do PhpBrew em si no github oficial! Para instalar uma versão específica com seus módulos: phpbrew install php-5.5.4 +hash +cli +cgi +bcmath +bz2 +apxs2 +filter +ftp +iconv +icu +gettext +intl +json +mbregex +mbstring +mhash +pcntl +pdo +phar +posix +zip +zlib +soap +sockets +tidy +tokenizer +xml_all +dom +debug +gd +mysql +intl +gettext +apxs2=/usr/bin/apxs2 -- --with-libdir=lib/x86_64-linux-gnu --withgd=shared --enable-gd-natf --with-jpeg-dir=/usr --with-png-dir=/usr --with-icu --enable-maintainer-zts phpbrew ext install pthreads Instale a versão que você quiser, com os módulos que você quiser. Os comandos são só de exemplo
    • Conheça o appserver.io! ● Servidor de aplicação para PHP, feito em PHP ● Motor com servlet, suporte completo a HTTP 1.1 ● Beans de sessão (stateful, stateless + singleton) ● Beans de mensagem ● Doctrine como provedor de persistência padrão ● Serviço de timer ● Fila de mensagens integrada ● Web services ● Clusterizável ● Já vem com uma versão do PHP com pthreads
    • Cuidados com as instalações ● Compilado: ● ● ● Atente-se a instalação somente em um usuário ou no servidor inteiro Via appserver: ● ● Atente-se a possível quebra na execução do apache e de outros módulos dependentes Com phpbrew: ● ● Não rode um make install a não ser que você saiba exatamente o que está fazendo! Falta de documentação detalhada Acima de tudo: pthreads e appserver AINDA SÃO INSTÁVEIS / BETA! Utilize somente se realmente for necessário ou dentro de um ambiente isolado
    • A classe Thread ● ● ● ● Extensível para criar seu próprio objeto de thread Ao iniciar seu processamento é aberta uma thread a parte do processamento principal Caso não haja alteração de fluxo com sincronizações, o processo morre somente quando toda sua execução esteja terminada e a de suas threads também Somente o contexto que cria uma thread pode iniciá-la e sincronizar com ela Em processamento Processo Thread 1 Thread 2 Processo Thread 1 Thread 2
    • A classe Worker ● Igual a classe Thread, mas com: ● Estado persistente ● ● ● Disponível desde sua inicialização até que a variável a quem foi atribuído saia de escopo ou seja explicitamente desligado Qualquer contexto com uma referência pode passar objetos do tipo Stackable, que serão executados pelo Worker dentro de uma Thread separada Seu método “run” é executado antes de objetos Stackable, ideal para utilizar como inicialização de ambiente, métodos e propriedades que serão usados no Stackable
    • A classe Stackable ● ● ● Acesso através da propriedade $this->worker ao Worker (e a qualquer método ou propriedade do mesmo) que iniciou a execução do Stackable Qualquer contexto com acesso a uma referência do Stackable pode ler e gravar nas suas propriedades e executar seus métodos independentemente do status da execução do Stackable (antes, durante e após sua execução) Indicado para utilizar como uma tarefa específica a ser feita
    • Sincronização com notify e wait ● Todos os objetos criados com classes ou herdadas de classes Pthreads tem uma forma de sincronização através dos métodos wait() e notify() ● O método wait() pausa a execução do run() de um objeto ● O método notify() faz a execução voltar de onde o run() parou ● Potente sincronização entre objetos Pthreads ● Pode ser usado com closures pelo synchronized() do Thread e do Stackable
    • Sincronização com Mutex e/ou Cond ● ● ● ● ● Mutex: MUTual EXClusion (Exclusão Mútua) e Cond: Conditional Variable (Variável Condicional) Como um semáforo binário podem ser usados para bloquear as threads em momento de execução por uma ou mais vezes O bloqueio e/ou desbloqueio é feito através do unlock() do Mutex, ou do signal() e/ou do broadcast() do Cond, pausando a Thread com um wait() É possível efetuar o bloqueio e o desbloqueio em qualquer contexto em execução que tenha uma referência para o recurso criado pelo Mutex Segundo o próprio Joe Watkins, praticamente não é usado a não ser que você seja um viciado por pthreads =]
    • Modificadores de acesso ● ● Qualquer escopo e contexto tem acesso ao seu conteúdo e executar qualquer método public ou protected Cuidado com quais classes herdarão as classes pthreads, pois seus métodos e atributos protected e private poderão ser acessados diretamente
    • Chega de teorias e mimimi! Vamos aos exemplos! Como funciona?
    • Dúvidas?
    • Obrigado! Contato E-mail: jonathanglima@gmail.com Facebook: https://www.facebook.com/jonathanglima Linkedin: http://www.linkedin.com/in/jonathanglima
    • Referências Doc Oficial: http://php.net/manual/en/book.pthreads.php Site do dev (Joe Watkins): http://pthreads.org/ Servidor de aplicação em PHP para PHP: http://appserver.io/ GitHub do projeto (contém exemplos na pasta examples!): https://github.com/krakjoe/pthreads Diferenças entre Threads, Workers, Mutex e Stackable: http://stackoverflow.com/questions/16914580/difference-between-threads-workers-mutex-stackable Exemplos: http://acm.msu.ru/mkoshp/php-chunked-xhtml/pthreads.tutorials.html Exemplos: https://github.com/jonathanglima/PhpConference2013PthreadsExemplos Mais links relevantes: http://rubsphp.blogspot.com.br/2013/07/threads-no-php-com-pthreads.html http://stackoverflow.com/questions/14126696/php-when-to-use-pthread https://github.com/c9s/phpbrew