Задать вопрос
@MazAlVlad

Как в Python передать словарь от одного процесса другому?

Один процесс постоянно создаёт новый словарь. Остальные процессы нуждаются в получении этого словаря.
Как в Python передать словарь от одного процесса другому?
Я сделал так, что этот словарь пишется в файл. Остальные его считывают.
Явно это не есть гуд, словарь меняется с каждым сетевым запросом, винчестер разрывается.
HELP!!! Либо пример, либо какую функцию нужно изучить?
  • Вопрос задан
  • 287 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MazAlVlad Автор вопроса
#СПС Dr. Bacon, разобрался
from multiprocessing import Process, Value, Array, current_process, Lock, Manager, Barrier
from time import sleep
from sys import exit


def my_transmitter(LOCK_PROCESS,START_BARRIER,my_number,my_array,my_dict,my_list):
    i=1
    START_BARRIER.wait()
    
    while i<5:
        LOCK_PROCESS.acquire()
        
        print('\n',current_process())
        my_number.value=i                   #общая переменная
        my_array[i]=i*100                   #общий массив
        my_dict['key'+str(i)]='value'+str(i)#эмуляция словаря
        my_list.append(i)                   #общий список
        
        print('my_number ',my_number.value)
        print('my_array ',my_array[:])
        print('my_dict ',my_dict)
        print('my_list ',my_list)
        
        LOCK_PROCESS.release()
        i=i+1
        sleep(3)
        continue
        
def my_receiver(MY_PAUSE,LOCK_PROCESS,START_BARRIER,my_number,my_array,my_dict,my_list):
    START_BARRIER.wait()
    
    while True:
        sleep(MY_PAUSE)
        LOCK_PROCESS.acquire()
        
        print('\n',current_process())
        print('my_number ',my_number.value)
        print('my_array ',my_array[:])
        print('my_dict ',my_dict)
        print('my_list ',my_list)
        
        LOCK_PROCESS.release()
        continue
    
    
    
if __name__ =='__main__':

    LOCK_PROCESS=Lock()
    
    START_BARRIER=Barrier(3)
    
    my_number=Value('d',0)              #общая переменная, чтоб пользоваться нужно сначало создать и скормить процессам,только числа
    my_array=Array('i',10)              #общий массив, я так понял не расширяемый, фиксированный размер, только числа, иначе исключение
                                        #нужно поковырять multiprocessing.sharedctypes, судя по всему это даёт возможность использовать не только числа
    
    my_dict=Manager().dict()            #от обычного словаря отличий пока не нашёл
    my_list=Manager().list(['A','B'])   #ведёт себя как обычный лист
                                        #также пишут, что Manager() медленее Value,Array
    
    
    PROCESS_TRANSMITTER=Process(target=my_transmitter,args=(LOCK_PROCESS,START_BARRIER,my_number,my_array,my_dict,my_list),name='TRANSMITTER')
    PROCESS_RECEIVER_1=Process(target=my_receiver,args=(2,LOCK_PROCESS,START_BARRIER,my_number,my_array,my_dict,my_list),name='RECEIVER_1',daemon=True)
    PROCESS_RECEIVER_2=Process(target=my_receiver,args=(4,LOCK_PROCESS,START_BARRIER,my_number,my_array,my_dict,my_list),name='RECEIVER_2',daemon=True)
    
    PROCESS_TRANSMITTER.start()
    PROCESS_RECEIVER_1.start()
    PROCESS_RECEIVER_2.start()
    
    PROCESS_TRANSMITTER.join()
    
    exit()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы