Google Stackdriver в многопроцессорном режиме не работает

Я создал конечную точку API с помощью Flask, где данные собираются и объединяются из других API. Чтобы сделать это эффективно, я использую многопроцессорность. Чтобы сохранить контроль, я хочу регистрировать все шаги, используя Google Stackdriver.

По какой-то причине я продолжаю получать ошибки при использовании Google Stackdriver в моей многопроцессорной среде. Ошибка и последующее предупреждение, которое я получаю в моем MWE, заключается в следующем:

Pickling client objects is explicitly not supported.
Clients have non-trivial state that is local and unpickleable.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\...\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\...\Anaconda3\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

Минимальный рабочий пример (исключая Flask/API для простоты):

project_name = project_name = 'budget_service'
message = 'This is a test'
labels = {
    'deployment': 'develop',
    'severity': 'info'
}

# Import libs
from google.cloud import logging
import multiprocessing as mp

# Initialize logging
logging_client = logging.Client()
logger = logging_client.logger(project_name)

# Function to write log
def writeLog(logger):
    logger.log_text(
        text = message,
        labels = labels
    )
    print('logger succeeded')

def testFunction():
    print('test')

# Run without mp
writeLog(logger)

# Run with mp
print(__name__)
if __name__ == '__main__':       
    try:
        print('mp started')

        # Initialize
        manager = mp.Manager()
        return_dict = manager.dict()
        jobs = []

        # Set up workers
        worker_log1 = mp.Process(name='testFunction', target=testFunction, args=[])
        worker_log2 = mp.Process(name='writeLog', target=writeLog, args=[logger])

        # Store in jobs
        jobs.append(worker_log1)
        jobs.append(worker_log2)


        # Start workers
        worker_log1.start()
        worker_log2.start()

        for job in jobs:
            job.join()

        print('mp succeeded')

    except Exception as err:
         print(err)

Почему невозможно совместить многопроцессорность с Google Stackdriver? Что я должен настроить (что я плохо понимаю), чтобы это работало?

0 ответов

На сегодняшний день (04.2019) ведение журнала в стекдрайвере по-прежнему не поддерживает многопроцессорность. Решением является либо:

  • Убедитесь, что ваши процессы запущены в spawn режим, а не fork (по умолчанию *nix), который запрещает делиться чем-либо
  • Избегайте явного совместного использования объектов журналирования, настраивая их отдельно в каждом процессе

С помощью fork Многопроцессорная обработка, как правило, плохая идея с библиотеками Google, но не единственной причиной, вызывающей проблемы, является stackdriver.

Другие вопросы по тегам