M
M
MazAlVlad2020-05-24 23:10:25
Python
MazAlVlad, 2020-05-24 23:10:25

How to transfer a dictionary from one process to another in Python?

One process is constantly creating a new dictionary. Other processes need to obtain this dictionary.
How to transfer a dictionary from one process to another in Python?
I made it so that this dictionary is written to a file. The rest are reading it.
Obviously this is not buzzing, the dictionary changes with every network request, the hard drive is broken.
HELP!!! Either an example, or which function to learn?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
D
Dr. Bacon, 2020-05-24
@MazAlVlad

https://docs.python.org/3.8/library/multiprocessin...

M
MazAlVlad, 2020-05-25
@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()

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question