Python мультипроцессирование завершается сбоем без вывода сообщений при генерации кэша с большим количеством ключей - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу заполнить кэш (memcached) для Django приложений с Python Мультипроцессором. Функция create_cache (keys) создает кеш для memcached. Около 5 миллионов ключей. Коэффициент от самого медленного до самого быстрого создания кэша составляет около 10. Я использую BaseCommand Django для запуска следующего python сценария:

#python imports
import multiprocessing as mp

# django imports
from django.core.management.base import BaseCommand
from .../apps import create_cache

class Command(BaseCommand):
    def handle(self, *args, **options):
        keys =[....]
        core_number = mp.cpu_count()
        len_keys = len(keys)
        chunk_size = int(len_keys / core_number / 10) 
        print ("total len",len_keys, "chunk_size",chunk_size) 
        pool = mp.Pool(core_number)
        try:
            pool.imap_unordered(create_cache, keys, chunk_size)
        except Exception as e:
            print("a worker failed, aborting...",e)
            pool.close()
            pool.terminate()
        else:
            print("before close")
            pool.close()
            pool.join()
            print("after join")

Этот код работает для нескольких тысяч ключей, но после 10 000 ключей, После «до закрытия» происходит сбой, и процесс остается бездействующим, и не все ключи создаются (я проверяю статистику в memcached). Кроме того, я не могу CTR + C этого процесса, я должен убить его в терминале. Я пытаюсь решить эту проблему, добавив спящий (0,0001) в create_cache перед cache.set (ключ, результат), но это замедляет работу скрипта и помогает создавать больше кешей, но не все. Интересно, потерял ли Multiprocessing memcached при слишком большом количестве ключей? Ubuntu 16.04, Python 2.7, Django 1.4

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