@MazAlVlad

Почему multiprocessing.Lock не блокирует доступ к файлу?

Изначально планировал пропускать в to_log по одному процессу, чтоб вести общий лог процессов. Но непонятным образом строки в логе скачут, либо лишний переход, либо наоборот нет символа перехода \n.
Переписал только необходимый кусок, будет формироваться 'my_log.txt', там всё видно. У меня:
2020-06-10 13:52:02 4FILE_BOT.txt RUNNIN2020-06-10 13:52:02 2_FILE.txt RUNNING
2020-06-10 13:52:02 1_FILE.txt RUNNING
G
2020-06-10 13:52:02 2_FILE.txt RUNNING
2020-06-10 13:52:02 2_FILE.txt RUNNING
G
2020-06-10 13:52:02 2_FILE.txt RUNNING
G
2020-06-10 13:52:02 2_FILE.txt RUNNING
Короче такой ужас. А теперь сам код;
from multiprocessing import Process,current_process,Lock#,BoundedSemaphore
from time import strftime,localtime,sleep

#LOCK_PROCESS_SEMAPHORE=BoundedSemaphore(value=1)
LOCK_PROCESS=Lock()
    
def to_log(FILE_LOG,STRING):
    LOCK_PROCESS.acquire()
    #LOCK_PROCESS_SEMAPHORE.acquire()                                       #занять семафор
    
    MY_TIME=strftime("%Y-%m-%d %H:%M:%S",localtime())                       #просто время
    STRING=MY_TIME+'\t'+'\t'+str(current_process().name)+'\t'+STRING        #просто к времени добавилось имя процесса
    print(STRING)                                                           #просто печать в консоль
    STRING=STRING+'\n'                                                      #просто добавление \n в строку
        
    #LOCK_PROCESS_SEMAPHORE.acquire()                                       #занять семафор

    '''
    with open (FILE_LOG,'a') as f:
        f.write(STRING)                                                     #просто сохранение строки
    '''
    FILE=open (FILE_LOG,'a')
    FILE.write(STRING)
    FILE.close()
        
    #LOCK_PROCESS_SEMAPHORE.release()                                       #освободить семафор
    LOCK_PROCESS.release() 

def my_processes():
    FILE_LOG='my_log.txt'
    while True:
        STRING='RUNNING'
        sleep(0.001)
        to_log(FILE_LOG,STRING)
        continue
    return
   
def start_PROCESS():
    MY_FILES=['1_FILE.txt', '2_FILE.txt', '4FILE_BOT.txt']                  #Это типо будущие процессы
    for MY_FILE in MY_FILES:
        Process_MY_BOT=Process(target=my_processes,name=MY_FILE)
        Process_MY_BOT.start()
   
if __name__ =='__main__':
    start_PROCESS()
    input('end')


Нашёл рабочий вариант:
from multiprocessing import Process,current_process,Lock
from time import strftime,localtime,sleep
    
def to_log(FILE_LOG,STRING,LOCK_PROCESS):
    LOCK_PROCESS.acquire()
    
    MY_TIME=strftime("%Y-%m-%d %H:%M:%S",localtime())                       #просто время
    STRING=MY_TIME+'\t'+'\t'+str(current_process().name)+'\t'+STRING        #просто к времени добавилось имя процесса
    print(STRING)                                                           #просто печать в консоль
    STRING=STRING+'\n'                                                      #просто добавление \n в строку

    FILE=open (FILE_LOG,'a')
    FILE.write(STRING)
    FILE.close()
        
    LOCK_PROCESS.release() 

def my_processes(LOCK_PROCESS):
    FILE_LOG='my_log.txt'
    while True:
        STRING='RUNNING'
        sleep(0.001)
        to_log(FILE_LOG,STRING,LOCK_PROCESS)
        continue
   
def start_PROCESS():
    LOCK_PROCESS=Lock()
    MY_FILES=['1_FILE.txt', '2_FILE.txt', '4FILE_BOT.txt']                  #Это типо будущие процессы
    for MY_FILE in MY_FILES:
        Process_MY_BOT=Process(target=my_processes,args=(LOCK_PROCESS,),name=MY_FILE)
        Process_MY_BOT.start()
   
if __name__ =='__main__':
    start_PROCESS()


Вопрос почему актуален, не могу понять принцип работы интерпретатора.
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Потому что блокировка в мультипроцессинге реализована с помощью семафоров, и если его не передать в аргументах пула - соответствующий дескриптор просто закроется при запуске воркер-процесса, и получится просто кучка не связанных между собой локов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы