{"subject_id":"3a3cc48d00998124bf5fd15d4f771788","topico":"Programação assíncrona: concorrência × paralelismo, event loop, promises, GIL","stems":["Em relação à linguagem de programação NodeJS, julgue o item a seguir.","A respeito de linguagens de programação, julgue os itens seguintes.","Com base no trecho de código precedente, escrito em Rust, que cria um contador, julgue o item a seguir.","No que se refere a testes de verificação de qualidade de códigos automatizados e a persistência, julgue os próximos itens."],"questions":[{"id":"bb480633187e","number":60,"stem":0,"statement":"Caso o ambiente e o programa não apresentem nenhum tipo de erro ou exceção, a execução do código a seguir terá como resultado 4 não é primo.\n\nfunction isPrime(number) {\n     return new Promise((resolve, reject) =>\n{\n     if (number <= 1) {\n       reject('$ {number} não é primo');\n     } else {\n       for (let i = 2; i <=\n               Math.sqrt(number); i++) {\n          if (number % i === “0”) {\n            reject('$ {number} não é primo');\n       resolve('$ {number} é primo');\n  });\n}\nisPrime(4).then(result =>\nconsole.log(result)).catch(error =>\nconsole.error(error));","answer":"E","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"O caminho de rejeição dentro do laço depende de uma comparação estrita entre o resto da divisão, que é número, e um valor textual. Em JavaScript a igualdade estrita não converte tipos, de modo que essa condição nunca é verdadeira e a rejeição do laço nunca ocorre. Sem rejeição, o tratador de erro não é acionado e a mensagem anunciada não é produzida.","distortion_type":"inversao","distorted_span":"terá como resultado 4 não é primo","corrected_statement":"Caso o ambiente e o programa não apresentem nenhum tipo de erro ou exceção, a execução do código a seguir não exibirá a mensagem de que 4 não é primo, pois a comparação estrita com um valor textual impede que a promessa seja rejeitada no laço.","concept":"Igualdade estrita não converte tipos; a promessa não rejeita","citation":null,"trap_note":"Em item que anuncia a saída de um código com promessa, decida primeiro qual dos dois caminhos ela toma, resolução ou rejeição. A mensagem afirmada costuma ser a do caminho que não é percorrido."}},{"id":"cc85939f47d0","number":77,"stem":1,"statement":"A execução do Node.js é single-thread, pois as requisições no ambiente são tratadas como eventos assíncronos e não bloqueáveis.","answer":"C","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"O JavaScript da aplicação em Node.js executa em uma única thread sobre um laço de eventos, e é justamente por isso que o modelo precisa ser assíncrono e não bloqueante: cada operação de entrada e saída é despachada sem parar a execução e seu retorno é enfileirado para quando o resultado chegar. Assim um único fluxo atende muitas conexões simultâneas sem precisar de travas.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Node.js: thread única de JavaScript com entrada e saída não bloqueante","citation":null,"trap_note":"Thread única e alta concorrência não se contradizem: a concorrência vem de nunca esperar, não de multiplicar threads. O erro aparece quando se atribui ao modelo ganho de processamento paralelo."}},{"id":"b79d27697a60","number":99,"stem":2,"statement":"A instrução let counter = Arc::new(0); combina exclusão mútua com contagem atômica de referência e garante acesso seguro e exclusivo a dados entre threads.\n\nimport pandas as pd\ndf = pd.DataFrame({\n   'Nome': ['Alice', 'Maria', 'Ana'],\n   'Idade': [25, 30, 35],\n   'Disciplina': ['Direito', 'Direito', 'Direito'],\n   'Situacao': ['Aprovada', 'Reprovada', 'Aprovada']\n})\ncolunas_interesse = ['Nome', 'Situacao']\ntabela = df[colunas_interesse].values.tolist()\nprint(tabela[0][0])","answer":"E","source":{"slug":"CPNUJE_24","ano":2024},"explanation":{"verdict_reason":"A contagem atômica de referências resolve apenas a posse compartilhada do dado entre threads: vários donos e liberação quando o último sai, com acesso somente de leitura. Exclusão mútua é outro mecanismo, fornecido por um tipo de trava que envolve o dado e exige adquiri-la para alterá-lo. Um contador compartilhado e mutável precisa dos dois, um dentro do outro, e não de um deles sozinho.","distortion_type":"atribuicao_errada","distorted_span":"combina exclusão mútua com contagem atômica de referência","corrected_statement":"A instrução let counter = Arc::new(Mutex::new(0)); combina exclusão mútua com contagem atômica de referência e garante acesso seguro e exclusivo a dados entre threads.","concept":"Posse compartilhada não é exclusão mútua","citation":null,"trap_note":"Quando um item atribui duas garantias distintas a uma única construção, separe-as e pergunte qual tipo entrega cada uma. Compartilhar referência e serializar escrita são problemas diferentes."}},{"id":"5b16a0c785da","number":100,"stem":3,"statement":"Nos testes com Jasmine, o comando beforeAll pode ser utilizado com promises ou funções assíncronas (como async ou await), para garantir que o código de preparação seja executado de forma assíncrona, antes dos testes.","answer":"C","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"Os ganchos de preparação do Jasmine aceitam trabalho assíncrono, inclusive o que roda uma única vez antes de todos os testes da suíte: a função pode devolver uma promessa ou ser declarada como assíncrona com espera, e o arcabouço só segue para os casos de teste quando a promessa se resolve. Sem esse suporte, os testes começariam antes de a preparação terminar.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Ganchos de preparação do Jasmine aceitam promessa e async","citation":null,"trap_note":"Arcabouço de teste moderno espera pelo assíncrono quando a função devolve promessa. O erro usual é o inverso: afirmar que a preparação só aceita código síncrono."}}]}