<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fernando Melo</title>
    <description>The latest articles on DEV Community by Fernando Melo (@nandosts).</description>
    <link>https://dev.to/nandosts</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1140454%2F060dd165-15e1-450e-9472-1de18d6ddda4.jpeg</url>
      <title>DEV Community: Fernando Melo</title>
      <link>https://dev.to/nandosts</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nandosts"/>
    <language>en</language>
    <item>
      <title>Trabalhando com Threads em Ruby</title>
      <dc:creator>Fernando Melo</dc:creator>
      <pubDate>Wed, 27 Sep 2023 20:01:05 +0000</pubDate>
      <link>https://dev.to/nandosts/trabalhando-com-threads-em-ruby-44f1</link>
      <guid>https://dev.to/nandosts/trabalhando-com-threads-em-ruby-44f1</guid>
      <description>&lt;p&gt;Na medida que você avança na sua carreira em programação, eficiência e desempenho se tornam uma preocupação cada vez maior em seus sistemas. Threads é uma ferramenta poderosíssima, que expande a liberdade de um desenvolvedor utilizando ao máximo o poder de processamento de seus sistemas. Então, não, não estamos falando sobre a rede social Threads hahah, Threads será um conhecimento que você, programador, não vai querer deixar de lado.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sumário&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sumário&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O que são threads?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exemplo de uso prático&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variáveis de Thread&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usando RequestStore&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;O que são threads?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para aqueles que não estão familiarizados com o conceito de threads: em resumo, imagine que as threads são como funcionários em uma empresa. Quatro funcionários podem colaborar para realizar a mesma tarefa, mas cada um pode ser responsável por uma atividade diferente e específica. Seu sistema também pode realizar várias tarefas ao mesmo tempo, usando essa ferramenta poderosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Exemplo de uso prático&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exportação de Dados&lt;/strong&gt;: Pense na funcionalidade do LinkedIn para exportar todos os dados da sua conta ou na função em aplicativos de mensagens como WhatsApp e Telegram. Seria problemático para os usuários terem que esperar em uma tela específica, assim como seria problemático para o sistema lidar com muitos usuários decidindo exportar um grande volume de dados simultaneamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Requisições Concorrentes&lt;/strong&gt; : Você também pode dividir suas solicitações em várias threads para otimizar o tempo e a eficiência do seu sistema para um cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controle de Fluxo de Dados&lt;/strong&gt;: Em casos mais avançados, lembre-se de que em sistemas de banco de dados relacionais, uma alteração pode afetar outros dados em seu sistema. É possível acompanhar quantas/quais solicitações foram feitas acompanhando as threads.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para demonstrar como isso pode ser implementado no contexto do Ruby, dê uma olhada no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TasksController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_emails&lt;/span&gt;
    &lt;span class="c1"&gt;# Create a thread to process emails in the background&lt;/span&gt;
    &lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="c1"&gt;# Logic for sending emails&lt;/span&gt;
      &lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Emails processados com sucesso!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;# Return an immediate response to the user&lt;/span&gt;
    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;plain: &lt;/span&gt;&lt;span class="s2"&gt;"Processando emails em segundo plano..."&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Variáveis de Thread&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Uma maneira de ter um melhor controle dentro de uma thread é usar variáveis. Isso é útil quando você precisa fazer alterações específicas dentro dessa thread. Exemplo de como criar variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um problema recorrente, é importante observar que o valor da thread pode persistir por mais tempo do que desejado. Lidar com threads pode ser complicado, e pode acontecer que o valor definido em "foo" ainda esteja presente em usos futuros da thread. Para evitar problemas, especialmente se você precisar salvar essas variáveis apenas durante uma sequência de requisições, você pode usar a gem "RequestStore", que lida com isso facilmente:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Usando RequestStore&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para definir a variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;RequestStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para acessar a variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;RequestStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;RequestStore&lt;/code&gt; é uma gem útil para gerenciar variáveis locais de thread e garantir um escopo adequado. Você pode encontrar mais informações e acessar o código em seu &lt;a href="https://github.com/steveklabnik/request_store"&gt;repositório do github&lt;/a&gt;. &lt;code&gt;RequestStore&lt;/code&gt; é um software de código aberto lançado sob a Licença MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusão&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Trabalhar com threads em Ruby oferece uma maneira eficaz de lidar com tarefas concorrentes, melhorando a eficiência e a capacidade de resposta do sistema. No entanto, é essencial ter cuidado ao gerenciar variáveis de thread para evitar problemas de persistência. O uso de ferramentas como o "RequestStore" pode tornar esse controle mais fácil. Com uma compreensão adequada desses conceitos, você pode otimizar eficaz e eficientemente a execução de tarefas em sua aplicação Ruby.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ruby-doc.org/core-3.0.0/Thread.html"&gt;&lt;code&gt;Documentação Oficial sobre Threads&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steveklabnik/request_store"&gt;&lt;code&gt;Repositório da RequestStore no github&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>braziliandevs</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
