Почему запись в один и тот же файл из разных процессов работает, а в документах говорится, что не следует - PullRequest
0 голосов
/ 12 сентября 2018

Я изучал, как я могу войти в один и тот же файл из разных процессов из этих официальных примеров: 1 , 2 .

Затем я попробовал простой примерведение журнала из разных процессов, но без выполнения действий, предложенных в приведенных выше примерах, то есть обычным способом без учета сценария многопроцессного ведения журнала:

Код

import time
import multiprocessing as mup
import sys
import os
import logging

def worker(name):

    logging.basicConfig(
     filename='temp.log',
     level=logging.INFO, 
     filemode = 'a',
     format= '[%(asctime)s][%(levelname)s]: %(message)s')

    logger = logging.getLogger()

    a = 0

    while(a < 5):
        print(name,":",a)
        logger.info("{}: {}".format(name,a))
        a = a+1
        time.sleep(0.2)
        pass 

    print("Exiting worker: ", name, "(", os.getpid(), ")")

def start_server():
    b = 0

    while(b<3):
        new_worker = mup.Process(target=worker,args=('worker-'+str(b),))
        new_worker.daemon = True
        new_worker.start()
        b = b + 1

    time.sleep(3600)

start_server()

Консоль

worker-0 : 0
worker-0 : 1
worker-1 : 0
worker-0 : 2
worker-1 : 1
worker-2 : 0
worker-0 : 3
worker-1 : 2
worker-2 : 1
worker-0 : 4
worker-1 : 3
worker-2 : 2
Exiting worker:  worker-0 ( 13300 )
worker-1 : 4
worker-2 : 3
Exiting worker:  worker-1 ( 13228 )
worker-2 : 4
Exiting worker:  worker-2 ( 11000 )

temp.log

[2018-09-12 17:28:21,442][INFO]: worker-0: 0
[2018-09-12 17:28:21,643][INFO]: worker-0: 1
[2018-09-12 17:28:21,655][INFO]: worker-1: 0
[2018-09-12 17:28:21,843][INFO]: worker-0: 2
[2018-09-12 17:28:21,855][INFO]: worker-1: 1
[2018-09-12 17:28:21,871][INFO]: worker-2: 0
[2018-09-12 17:28:22,044][INFO]: worker-0: 3
[2018-09-12 17:28:22,056][INFO]: worker-1: 2
[2018-09-12 17:28:22,071][INFO]: worker-2: 1
[2018-09-12 17:28:22,244][INFO]: worker-0: 4
[2018-09-12 17:28:22,256][INFO]: worker-1: 3
[2018-09-12 17:28:22,272][INFO]: worker-2: 2
[2018-09-12 17:28:22,456][INFO]: worker-1: 4
[2018-09-12 17:28:22,472][INFO]: worker-2: 3
[2018-09-12 17:28:22,672][INFO]: worker-2: 4

Удивительно, но это работало.Я думал, что должен столкнуться с некоторыми конфликтами доступа к файлу при входе в один и тот же файл из разных процессов.Но этого не произошло.В многопроцессорном пакете указано следующее :

Хотя ведение журнала является поточно-ориентированным, и поддерживается запись в один файл из нескольких потоков в одном процессе, запись в один файл изнесколько процессов не поддерживается, потому что нет стандартного способа сериализации доступа к одному файлу между несколькими процессами в Python.

Так что это работает, потому что выполнение

 new_worker.daemon = True

делаетна самом деле не создать новый процесс, а просто новый поток?

Я на Windows 7 64-разрядная версия Python 3.6.4 на Cygwin

1 Ответ

0 голосов
/ 12 сентября 2018

Не поддерживается не означает, что ожидаемое поведение должно завершиться с ошибками.Это просто означает, что они не обещают производительность и поведение при таких обстоятельствах.

Не поддерживается , вероятно, также означает, что из-за названных технических сложностей нежелательно пытаться выяснить последствия ведения журнала из нескольких процессов во всех типах контекстов.

Что в основном означает YMMV, и не пишите команде Python, когда вы начинаете получать ошибки ввода-вывода или искаженные журналы, если вы решите продолжить вход в систему таким способом.Похоже, что он работает нормально для вас, но если вы собираетесь масштабировать свое приложение или переместить его в другую ОС, которая может обрабатывать файловый ввод-вывод другим способом, то просто предупреждаю ... это поведение не поддерживается.

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