rjmalves / sintetizador-newave

Programa auxiliar para realizar a síntese de dados de saída do programa NEWAVE em arquivos de texto ou banco de dados.
https://rjmalves.github.io/sintetizador-newave/
MIT License
5 stars 2 forks source link

Uso de paralelismo do sintetizador-newave viola tamanho máximo de socket AF_UNIX permitido pelo linux #9

Open rjmalves opened 1 year ago

rjmalves commented 1 year ago

Quando usado em ambientes que sobrescrevem a variável de ambiente TMPDIR, o sintetizador pode produzir um erro na hora de lançar os processos workers:

Process SyncManager-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/usr/local/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.8/multiprocessing/managers.py", line 608, in _run_server
    server = cls._Server(registry, address, authkey, serializer)
  File "/usr/local/lib/python3.8/multiprocessing/managers.py", line 154, in __init__
    self.listener = Listener(address=address, backlog=16)
  File "/usr/local/lib/python3.8/multiprocessing/connection.py", line 448, in __init__
    self._listener = SocketListener(address, family, backlog)
  File "/usr/local/lib/python3.8/multiprocessing/connection.py", line 591, in __init__
    self._socket.bind(address)
OSError: AF_UNIX path too long

Este comportamento é conhecido e é devido a uma limitação do Linux, não do python, e não possui uma solução trivial

rjmalves commented 1 year ago

Como solução temporária, forçar a variável de ambiente na chamada do interpretador do python pode ser uma alternativa:

TMPDIR="/tmp" python3 main.py

Em ambientes que utilizem o SGE para gerenciamento de jobs, é sabido que o TMPDIR no escopo do job é sobrescrito para um diretório que envolve o ID do job e a fila. Um exemplo de socket gerado:

/tmp/3.1.all.q/pymp-e2xj075i/listener-i_63cfjl

Com isso, dependendo do ID e do nome da fila, isto pode acontecer. Forçando a variável de ambiente conforme mencionado, isto se torna:

/tmp/pymp-e2xj075i/listener-i_63cfjl