Python многопроцессорная обработка pool.close и pool.join Ошибка типа: объект 'NoneType' не вызывается - PullRequest
2 голосов
/ 14 марта 2020

Я получаю ошибку TypeError: 'NoneType' object is not callable в self.pool.join, вызванную методом __del__ модуля , содержащего следующий код .

В частности, ошибка возникает при запуске миграций базы данных или набора тестов в приложении Django.

Я попытался реализовать import atexit и зарегистрировать методы внутри __init__ через :

atexit.register(self.pool.close)
atexit.register(self.pool.join)

... но это не сработало.

Почему эта ошибка TypeError встречается в приведенном ниже коде __del__ метода, и как я могу избежать его?

import datetime
import json
import mimetypes
from multiprocessing.pool import ThreadPool
import os
import re
import tempfile

# python 2 and python 3 compatibility library
import six
from six.moves.urllib.parse import quote

from paapi5_python_sdk.configuration import Configuration
import paapi5_python_sdk
from paapi5_python_sdk import rest

from paapi5_python_sdk.auth.sig_v4 import AWSV4Auth

class ApiClient(object):
    PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types
    NATIVE_TYPES_MAPPING = {
        'int': int,
        'long': int if six.PY3 else long,  # noqa: F821
        'float': float,
        'str': str,
        'bool': bool,
        'date': datetime.date,
        'datetime': datetime.datetime,
        'object': object,
    }

    def __init__(self,
                 access_key,
                 secret_key,
                 host,
                 region,
                 configuration=None,
                 header_name=None,
                 header_value=None,
                 cookie=None):
        if configuration is None:
            configuration = Configuration()
        self.configuration = configuration

        self.pool = ThreadPool()
        self.rest_client = rest.RESTClientObject(configuration)
        self.default_headers = {}
        if header_name is not None:
            self.default_headers[header_name] = header_value
        self.cookie = cookie
        # Set default User-Agent.
        self.user_agent = 'paapi5-python-sdk/1.0.0'

        self.access_key = access_key
        self.secret_key = secret_key
        self.host = host
        self.region = region

    def __del__(self):
        self.pool.close()
        self.pool.join()

    ... rest of module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...