Google Stackdriver в многопроцессорной среде не работает - PullRequest
0 голосов
/ 02 мая 2018

Я создал конечную точку 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? Что мне нужно настроить (что я плохо понимаю), чтобы это работало?

1 Ответ

0 голосов
/ 28 апреля 2019

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

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

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

...