Repository navigation
Conversation
O Ctrl-C é simulado com SIGINT ao thread principal: no sequencial ele corta a chamada em curso, e no paralelo chega enquanto o thread principal espera as linhas. O caso da issue, 12 linhas, batch_size=5 e Ctrl-C na 9ª chamada, roda com entrada pandas e polars nos dois modos e confere que o checkpoint tem as linhas pagas e que a retomada não as chama de novo. O teste da execução recusada passa a interromper B depois de uma linha: com o limite de uso e com o Ctrl-C, B grava o próprio checkpoint e C retoma dele.
Os dois laços passam a tratar o KeyboardInterrupt num envoltório: gravam as linhas registradas desde a última gravação e relançam. Sem linha nova, o arquivo fica como estava. No paralelo, a saída do executor espera as chamadas em andamento, e a cópia sob a trava leva só as que terminaram; a gravação passa pelo _SnapshotWriter, que não regride o arquivo. A falha de gravação vira aviso em _try_save_checkpoint e não troca a interrupção. O tratamento de cada linha não muda; o diff reindenta o corpo dos laços.
No pytest 7.0, o piso do extra dev que o job lowest-direct instala, um pytest.warns dentro do outro engole os avisos do de fora, e o aviso de outra configuração não chegava ao pytest.warns que o esperava.
…inha vai para process_row O try em volta do laço inteiro reindentava o registro da linha, e qualquer mudança dentro dele conflitaria com este ramo. O registro volta à indentação da main numa função interna, e só o laço que pula, conta, grava e espera fica dentro do try. A gravação segue no frame de _process_rows, e o aviso de falha continua apontando a chamada do usuário.
O try em volta do with do tqdm reindentava o despacho e a coleta das linhas. Um gerenciador de contexto, _on_ctrl_c, entra no with que já existia e chama a gravação no Ctrl-C antes de relançá-lo. Ele fica fora do tqdm, que fecha antes da gravação, como no try. A gravação vira a função interna save_registered_rows, com o comentário que estava no except, e o PLR0912 que o try exigia sai do noqa.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Um Ctrl-C (
KeyboardInterrupt) no meio da execução não gravava o checkpoint. O arquivo ficava na última gravação debatch_size, e a retomada pagava de novo as linhas do lote em andamento. Com 12 linhas,batch_size=5e Ctrl-C durante a 9ª chamada, o modo sequencial tinha 8 chamadas pagas e 5 linhasprocessedno arquivo, e a retomada chamavat06,t07et08de novo. Comparallel_requests, 9 chamadas pagas, as mesmas 5 no arquivo e 4 linhas pagas duas vezes. O resultado é igual com entrada pandas e polars; com pandas, as linhas pagas ainda ficam no DataFrame do usuário, alterado no lugar, mas o arquivo fica igualmente atrasado.A interrupção por
ProviderUsageLimitErrorjá gravava o checkpoint, e o teste detest_retomada_assinada.pyregistrava essa diferença.O que muda
_process_rowse_process_rows_paralleltratam oKeyboardInterruptnum envoltório dos laços: gravam as linhas registradas desde a última gravação e relançam a interrupção. Sem linha nova desde a última gravação, o arquivo fica como estava; um Ctrl-C antes da primeira linha de uma execução que recusou o checkpoint anterior, por exemplo, não o sobrescreve.ThreadPoolExecutorjá espera as chamadas em andamento, e elas chegam ao envoltório registradas. A cópia do DataFrame sai sob a trava das linhas, e a gravação passa pelo_SnapshotWriter, que descarta o snapshot sem linha contada desde o último gravado e não grava ao mesmo tempo que uma thread._try_save_checkpoint: vira aviso, e oKeyboardInterruptsai como entrou.checkpoint_path, nada muda.docs/guides/faq.mdedocs/en/guides/faq.md, diz o que o Ctrl-C faz com o lote em andamento.O tratamento de cada linha (sucesso, erro, abort, limite de uso) não muda. O diff reindenta o corpo dos dois laços, que passam a ficar dentro do
try;git diff -wmostra só o envoltório.Decisão sobre o modo paralelo
Pela decisão posta na issue, a gravação registra só as linhas concluídas, e as que estavam em andamento ficam pendentes para a retomada. Na prática, o primeiro Ctrl-C espera as chamadas em andamento terminarem, e elas entram na gravação. Só um segundo Ctrl-C durante essa espera deixa chamadas sem terminar, e elas ficam pendentes; o teste
test_segundo_ctrl_c_grava_so_as_linhas_concluidascobre esse caso.Testes
test_ctrl_c_grava_as_linhas_pagas_e_a_retomada_nao_as_chama_de_novo: o caso da issue, com entrada pandas e polars, no sequencial e com 3 workers. O Ctrl-C é um SIGINT mandado ao thread principal, como o do terminal.test_falha_ao_gravar_no_ctrl_c_avisa_e_mantem_o_keyboard_interrupt, nos dois modos.test_ctrl_c_antes_de_terminar_uma_linha_nao_reescreve_o_checkpoint, nos dois modos.test_ctrl_c_sem_checkpoint_deixa_as_linhas_pagas_na_entrada_pandas, nos dois modos.test_execucao_recusada_e_interrompida_nao_adota_o_checkpoint_antigopassa a interromper B depois de uma linha: com o limite de uso e com o Ctrl-C, B grava o próprio checkpoint, e C retoma dele sem nenhuma resposta de A.Closes #213