Partage de données de type liste entre processus par traitement parallèle à l'aide du multitraitement Python

1. Introduction Lors de la mise en œuvre du traitement parallèle à l'aide du multitraitement en Python, je suis resté coincé dans le processus de partage de données de type tableau entre les processus, je vais donc le laisser comme un mémorandum. La version de python une fois implémentée est 3.7.1.

2. Détails de mise en œuvre Le contenu de l'implémentation est un processus dans lequel les deux fonctions suivantes sont traitées en parallèle et une liste prise comme argument est partagée entre les processus. (1) Traitement pour afficher la liste reçue en argument toutes les 3 secondes (2) Traitement pour ajouter un à la liste reçue en argument toutes les 2 secondes

J'ai utilisé un objet Manager pour la gestion de l'état entre les processus.

3. Mauvaise implémentation ```python from multiprocessing import Process, Manager import time

#Afficher la liste toutes les 3 secondes def list_print(test_list): while True: print(str(test_list)) time.sleep(3)

#Ajouter un à la liste toutes les 2 secondes def list_append(test_list): while True: test_list.append("a") time.sleep(2)

if name == 'main': manager = Manager() test_list=manager.list() print("Liste avant l'exécution de la fonction" +str(test_list)) p1=Process(target=list_print,args=(test_list)) p2=Process(target=list_append,args=(test_list)) p1.start() p2.start() p1.join() p2.join()


 <h2> 4. Résultat de l'exécution </ h2>

Traceback (most recent call last): Traceback (most recent call last): File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) TypeError: list_append() missing 1 required positional argument: 'test_list' TypeError: list_print() missing 1 required positional argument: 'test_list'


 Apparemment, la manière de prendre l'argument était mauvaise et une erreur s'est produite.
 Je me suis demandé si l'objet Manager ne prend pas en charge les types de liste, mais il dit officiellement qu'il prend en charge les listes.
 Alors après avoir lu la référence pendant un moment, j'ai trouvé une solution.

 <h2> 5. Solution </ h2>
 Il a été résolu en définissant un dictionnaire comme premier argument de la fonction à exécuter.
 Il définit un dummy dictionnaire vide et le prend comme argument.
 Le code est ci-dessous.


```python
from multiprocessing import Process,Manager
import time

#Afficher la liste
def list_print(dummy, test_list):
    while True:
        print(str(test_list))
        time.sleep(3)

#Ajouter un à la liste
def list_append(dummy, test_list):
    while True:
        test_list.append("a")
        time.sleep(2)

if __name__ == '__main__':
    manager = Manager()
    #Définir un dictionnaire vide
    dummy = manager.dict()
    test_list=manager.list()
    print("Liste avant l'exécution de la fonction" +str(test_list))
   #Ajouter un dictionnaire vide au premier argument
    p1=Process(target=list_print,args=(dummy, test_list))
    p2=Process(target=list_append,args=(dummy, test_list))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

6. Résultat de l'exécution Le résultat de l'exécution est le suivant. J'ai pu confirmer l'affichage et l'ajout du tableau en toute sécurité.
Liste avant l'exécution de la fonction[]
[]
['a', 'a']
['a', 'a', 'a']
['a', 'a', 'a', 'a', 'a']

c'est tout.

Recommended Posts

Partage de données de type liste entre processus par traitement parallèle à l'aide du multitraitement Python
Traitement parallèle Python (multitraitement et Joblib)
[Python] Divers traitements de données utilisant le tableau Numpy
Comment prendre plusieurs arguments lors d'un traitement parallèle à l'aide du multitraitement en python
Traiter les données csv avec python (traitement du comptage à l'aide de pandas)
Traitement de la communication par Python
Traitement parallèle avec multitraitement
Mémo récapitulatif des types de données Python
Conversion de type de données d'image [Python]
Analyse de données à l'aide de pandas python
Utilisation du mode Python dans le traitement
Traitement du langage naturel japonais utilisant Python3 (4) Analyse des émotions par régression logistique
Traitement parallèle Python (multitraitement et Joblib)
Comment prendre plusieurs arguments lors d'un traitement parallèle à l'aide du multitraitement en python