Я хочу заполнить кэш (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