Problema no plug-in impede simular mais de 20 steps
Closed this issue · 1 comments
Baseado nos testes de @wdvichete84
Assunto do issue
Executar o modelo a partir da interface limita a execução a apenas 20 steps.
O problema persistiu mesmo depois que @LINAMARIAOSORIO inseriu novos arquivos do dataset (a pasta de dados da REPAR já foi substituída no drive).
Verifiquei que, com o mesmo arquivo de configuração, o executável standalone consegue mais de 20 steps, e o código do modelo (develop branch) também executa mais de 20 steps.
Testei em mais de um equipamento e o comportamento se repetiu.
Meu ambiente
- Lenovo ThinkPad P52s;
- Intel Core i7 8550U;
- 16 GB RAM;
- Intel UHD 620;
- NVIDIA QUADRO P500 (driver 200.93);
- Windows 10 Pro 2004 build 19041.985 (up-to-date);
- Resolução Full HD sem reescalonamento;
- QGIS 3.16.7 LTR (code rev. 047173889);
- Qt 5.11.2;
- Plugins QGIS instalados: Nenhum;
- Temas QGIS instalados: Nenhum.
Passos para reproduzir
- Abrir o QGIS;
- Instalar o plugin a partir do arquivo .zip;
- Inserir os dados da REPAR;
- Executar o plugin;
Comportamento esperado
O plug-in chama o executável standalone com o arquivo de configuração gerado, executa e gera os arquivos de saída correspondente aos meses definidos.
Comportamento atual
O plug-in chama o executável standalone com o arquivo de configuração gerado, executa e não gera os arquivos de saída correspondente aos meses definidos. São gerados aproximadamente 20 arquivos de saída antes que o executável pare de se comportar como deveria e fique eternamente em execução.
De acordo com a documentação de uma das funções que estava sendo utilizada na chamada do executável standalone quando o buffer de um pipe enche, o processo de gravação para até que um processo de leitura leia alguns dos dados em questão; mas não estávamos lendo nada até que o subprocesso fosse concluído, daí o deadlock
.
Note This will deadlock when using
stdout=PIPE
orstderr=PIPE
and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. UsePopen.communicate()
when using pipes to avoid that.