{"id":9314,"date":"2023-11-20T14:42:03","date_gmt":"2023-11-20T17:42:03","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9314"},"modified":"2023-12-27T08:57:07","modified_gmt":"2023-12-27T11:57:07","slug":"precisa-de-desempenho-voce-precisa-dominar-abordagens-concorrentes","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/precisa-de-desempenho-voce-precisa-dominar-abordagens-concorrentes\/","title":{"rendered":"Precisa de desempenho? Voc\u00ea precisa dominar abordagens concorrentes"},"content":{"rendered":"\n<p>Com os processadores atingindo certos limites f\u00edsicos, a busca por desempenho est\u00e1 se deslocando do aumento da frequ\u00eancia para o aprimoramento da execu\u00e7\u00e3o paralela de tarefas. J\u00e1 n\u00e3o basta que o c\u00f3digo seja r\u00e1pido, ele precisa ser <em>concurrent<\/em>, capaz de executar diversas opera\u00e7\u00f5es ao mesmo tempo para aproveitar ao m\u00e1ximo a capacidade dos processadores modernos. Quais s\u00e3o as implica\u00e7\u00f5es disto para voc\u00ea, programador?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Desafio da Concorr\u00eancia para Programadores<\/h2>\n\n\n\n<p>Voc\u00ea j\u00e1 se perguntou como seu c\u00f3digo pode executar de maneira eficiente em um ambiente onde m\u00faltiplos cores e threads s\u00e3o a norma? A habilidade de escrever c\u00f3digo que se beneficia da execu\u00e7\u00e3o concorrente \u00e9 hoje uma exig\u00eancia no arsenal de um desenvolvedor.<\/p>\n\n\n\n<p>Aqui surge uma reflex\u00e3o necess\u00e1ria: como transitar do desenvolvimento sequencial, muitas vezes instintivo, para um modelo que explora a concorr\u00eancia de maneira eficiente e segura? \u00c9 uma transi\u00e7\u00e3o simples? N\u00e3o exatamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aprofundando em Padr\u00f5es de Programa\u00e7\u00e3o Concorrente<\/h2>\n\n\n\n<p>Ao abordar a concorr\u00eancia, n\u00e3o basta apenas dividir o c\u00f3digo para ser executado em paralelo; \u00e9 preciso compreender e aplicar padr\u00f5es de programa\u00e7\u00e3o concorrente que garantam n\u00e3o apenas a performance, mas tamb\u00e9m a corre\u00e7\u00e3o e a robustez.<\/p>\n\n\n\n<p><em>Padr\u00f5es de Projeto<\/em> ou <em>Design Patterns<\/em> para concorr\u00eancia s\u00e3o ferramentas conceituais que guiam na cria\u00e7\u00e3o de solu\u00e7\u00f5es eficientes e leg\u00edveis para desafios comuns de programa\u00e7\u00e3o paralela. Um padr\u00e3o muito conhecido \u00e9 o <em>Producer-Consumer<\/em>, no qual um processo cria dados (<em>producer<\/em>) e outro consome (<em>consumer<\/em>), geralmente intermediados por uma fila de espera.<\/p>\n\n\n\n<p>Mas e sobre outros desafios como <em>Locks<\/em>, <em>Deadlocks<\/em>, <em>Starvation<\/em> e <em>Race Conditions<\/em>? Estes s\u00e3o apenas alguns dos problemas que podem surgir quando come\u00e7amos a manipular execu\u00e7\u00e3o simult\u00e2nea de tarefas. Cada um destes problemas tem padr\u00f5es e pr\u00e1ticas que ajudam na mitiga\u00e7\u00e3o e resolu\u00e7\u00e3o, como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Locks:<\/strong> Garantir o acesso exclusivo a recursos compartilhados.<\/li>\n\n\n\n<li><strong>Deadlocks:<\/strong> Evitar que m\u00faltiplas threads fiquem bloqueadas permanentemente, esperando umas pelas outras.<\/li>\n\n\n\n<li><strong>Starvation:<\/strong> Assegurar que todas as threads tenham acesso justo aos recursos.<\/li>\n\n\n\n<li><strong>Race Conditions:<\/strong> Prevenir que v\u00e1rias threads acessem e modificam dados compartilhados simultaneamente.<\/li>\n<\/ul>\n\n\n\n<p>Imaginemos uma aplica\u00e7\u00e3o com m\u00faltiplos usu\u00e1rios acessando e modificando dados simultaneamente. Sem uma estrat\u00e9gia como o <em>Locking<\/em>, por exemplo, voc\u00ea poderia acabar com um estado de dados inconsistente.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"lock (myLockObject)\n{\n    \/\/ C\u00f3digo que manipula uma se\u00e7\u00e3o cr\u00edtica\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #88C0D0\">lock<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">myLockObject<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ C\u00f3digo que manipula uma se\u00e7\u00e3o cr\u00edtica<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>No exemplo acima, um <em>lock<\/em> \u00e9 utilizado para sincronizar o acesso a uma se\u00e7\u00e3o cr\u00edtica de c\u00f3digo, garantindo que a mesma n\u00e3o seja executada por m\u00faltiplas threads ao mesmo tempo, evitando assim as condi\u00e7\u00f5es de corrida.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Necessidade do Aprendizado Cont\u00ednuo<\/h2>\n\n\n\n<p>N\u00e3o \u00e9 segredo que dominar essas pr\u00e1ticas demanda tempo e dedica\u00e7\u00e3o. \u00c9 um processo cont\u00ednuo de aprendizado.<\/p>\n\n\n\n<p>Como voc\u00ea se sente em rela\u00e7\u00e3o a esse desafio? Preparado ou incerto? N\u00e3o importa em qual est\u00e1gio voc\u00ea esteja, o importante \u00e9 reconhecer a necessidade de aprimorar constantemente suas habilidades em programa\u00e7\u00e3o concorrente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Em conclus\u00e3o, a capacidade para desenvolver com concorr\u00eancia est\u00e1 cada vez mais em voga devido \u00e0s mudan\u00e7as nos processadores e nas exig\u00eancias de software. A compreens\u00e3o profunda dos padr\u00f5es de programa\u00e7\u00e3o concorrente \u00e9 vital para o desenvolvimento de software moderno. Sem ela, n\u00e3o se pode esperar atingir todo o potencial dos sistemas atuais.<\/p>\n\n\n\n<p>O aprendizado de conceitos e padr\u00f5es de concorr\u00eancia pode inicialmente parecer intimidante, mas com a pr\u00e1tica e a dedica\u00e7\u00e3o se torna uma ferramenta extremamente poderosa na constru\u00e7\u00e3o de aplica\u00e7\u00f5es eficientes e confi\u00e1veis.<\/p>\n\n\n\n<p>Alternativas aos padr\u00f5es tradicionais, como a programa\u00e7\u00e3o reativa ou o uso de linguagens que naturalmente incorporam conceitos de concorr\u00eancia, como Elixir ou Go, podem ser exploradas para diferentes contextos de aplica\u00e7\u00e3o.<\/p>\n\n\n\n<p>No entanto, independentemente da abordagem ou tecnologia escolhida, a conquista da concorr\u00eancia eficaz certamente passar\u00e1 por um investimento em educa\u00e7\u00e3o continuada em padr\u00f5es de projeto e pr\u00e1ticas de c\u00f3digo seguro e escal\u00e1vel.<\/p>\n\n\n\n<p>Tanto em meus grupos de estudos quanto em sess\u00f5es de mentoria, aprofundamos o dom\u00ednio desses t\u00f3picos, preparando os desenvolvedores para o exigente mercado de tecnologia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A execu\u00e7\u00e3o concorrente de tarefas \u00e9 essencial para aproveitar ao m\u00e1ximo os processadores modernos.<\/li>\n\n\n\n<li>Padr\u00f5es de programa\u00e7\u00e3o concorrente s\u00e3o essenciais para desenvolver c\u00f3digo eficiente e seguro em ambientes multithreaded.<\/li>\n\n\n\n<li>O dom\u00ednio de padr\u00f5es de projeto e concorr\u00eancia \u00e9 um processo cont\u00ednuo e essencial para qualquer desenvolvedor que deseje manter-se relevante no mercado de tecnologia.<\/li>\n<\/ol>\n","protected":false},"featured_media":9315,"parent":0,"template":"","cursos":[5],"class_list":["post-9314","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-algortimos"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/9314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/9315"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9314"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}