Я изучал, как я могу войти в один и тот же файл из разных процессов из этих официальных примеров: 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