Skip to content

OSError: [Errno 24] Too many open files #335

@SrLucca

Description

@SrLucca

Olá, constantemente possuo problemas ao gerar notas de modo assíncrono com a seguinte mensagem de erro:

Traceback (most recent call last):
File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task
R = retval = fun(*args, **kwargs)
File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 731, in protected_call
return self.run(*args, **kwargs)
File "/var/www/gti/fhserasa/financeiro/util.py", line 997, in gerar_nfse
raise e
File "/var/www/gti/fhserasa/financeiro/util.py", line 991, in gerar_nfse
xml_send = goiania.xml_gerar_nfse(certify, **rps)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 45, in xml_gerar_nfse
return _render(certificado, "GerarNfse", **kwargs)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 15, in _render
xml_send = render_xml(path, f"{method}.xml", False, **kwargs)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/xml/init.py", line 29, in render_xml
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 997, in get_template
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 958, in _load_template
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 125, in load
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 197, in get_source
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/utils.py", line 228, in open_if_exists
OSError: [Errno 24] Too many open files: '/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/templates/GerarNfse.xml'

Imagino que o erro pode estar na forma que é gerenciado os arquivos nestes trechos nos arquivos pytrustnfe3/pytrustnfe/nfse/goiania/init.py e pytrustnfe3/pytrustnfe/xml/init.py:

pytrustnfe3/pytrustnfe/xml/init.py

def render_xml(path, template_name, remove_empty, **nfe):
    nfe = recursively_normalize(nfe)
    env = Environment(loader=FileSystemLoader(path))
    env.filters["normalize"] = filters.strip_line_feed
    env.filters["normalize_str"] = filters.normalize_str
    env.filters["format_percent"] = filters.format_percent
    env.filters["format_datetime"] = filters.format_datetime
    env.filters["format_date"] = filters.format_date
    env.filters["comma"] = filters.format_with_comma

    template = env.get_template(template_name)
    xml = template.render(**nfe).replace("\n", "")
    parser = etree.XMLParser(
        remove_blank_text=True, remove_comments=True, strip_cdata=False
    )
    root = etree.fromstring(xml, parser=parser)
    for element in root.iter("*"):  # remove espaços em branco
        if element.text is not None and not element.text.strip():
            element.text = None
    if remove_empty:
        context = etree.iterwalk(root)
        for dummy, elem in context:
            parent = elem.getparent()
            if recursively_empty(elem):
                parent.remove(elem)
        return root
    return etree.tostring(root, encoding=str)

pytrustnfe3/pytrustnfe/nfse/goiania/init.py

def _render(certificado, method, **kwargs):
    path = os.path.join(os.path.dirname(__file__), "templates")
    xml_send = render_xml(path, f"{method}.xml", False, **kwargs)
    signer = Assinatura(certificado.pfx, certificado.password)
    xml_send = etree.fromstring(xml_send)
    xml_send = signer.assina_xml(xml_send)
    return xml_send


def _send(certificado, method, **kwargs):
    base_url = "https://nfse.goiania.go.gov.br/ws/nfse.asmx?wsdl"
    xml_send = kwargs["xml"]
    cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password)
    cert, key = save_cert_key(cert, key)
    client = get_authenticated_client(base_url, cert, key)

    try:
        response = getattr(client.service, method)(xml_send)
    except suds.WebFault as e:
        return {
            "send_xml": str(xml_send),
            "received_xml": str(e.fault.faultstring),
            "object": None,
        }

    response, obj = sanitize_response(response)
    return {"send_xml": str(xml_send), "received_xml": str(response), "object": obj}


def xml_gerar_nfse(certificado, **kwargs):
    """ Retorna o XML montado para ser enviado para o Webservice """

    return _render(certificado, "GerarNfse", **kwargs)

Alguem tem ideia de como resolver este problema?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions