LabSid-USP/RUBEMHydrological

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

  1. Abrir o QGIS;
  2. Instalar o plugin a partir do arquivo .zip;
  3. Inserir os dados da REPAR;
  4. 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 or stderr=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. Use Popen.communicate() when using pipes to avoid that.

References
1 2