Python Language Passer des données entre des processus multiprocessus


Exemple

Les données étant sensibles lorsqu'elles sont traitées entre deux threads (pensez que les lectures simultanées et les écritures concurrentes peuvent être en conflit les unes avec les autres, provoquant des conditions de concurrence), un ensemble d'objets uniques a été créé pour faciliter la transmission des données entre les threads. Toute opération vraiment atomique peut être utilisée entre les threads, mais il est toujours prudent de s'en tenir à la file d'attente.

import multiprocessing
import queue
my_Queue=multiprocessing.Queue() 
#Creates a queue with an undefined maximum size
#this can be dangerous as the queue becomes increasingly large
#it will take a long time to copy data to/from each read/write thread

Lors de l'utilisation de la file d'attente, la plupart des utilisateurs suggèrent de toujours placer les données de la file d'attente dans un essai: sauf: bloquer au lieu d'utiliser vide. Cependant, pour les applications où il est queue.Empty==True passer un cycle d'analyse (les données peuvent être placées dans la file d'attente en retournant les états de queue.Empty==True en queue.Empty==False d' queue.Empty==False ) il est généralement préférable de lire et écrivez un accès dans ce que j'appelle un bloc Iftry, car une instruction "if" est techniquement plus performante que la capture d'une exception.

import multiprocessing
import queue
'''Import necessary Python standard libraries, multiprocessing for classes and queue for the queue exceptions it provides'''
def Queue_Iftry_Get(get_queue, default=None, use_default=False, func=None, use_func=False):
    '''This global method for the Iftry block is provided for it's reuse and 
standard functionality, the if also saves on performance as opposed to catching
 the exception, which is expencive.
        It also allows the user to specify a function for the outgoing data to use,
 and a default value to return if the function cannot return the value from the queue'''
        if get_queue.empty():
            if use_default:
                return default
        else:
            try:
                value = get_queue.get_nowait()
            except queue.Empty:
                if use_default:
                    return default
            else:
                if use_func:
                    return func(value)
                else:
                    return value
    def Queue_Iftry_Put(put_queue, value):
        '''This global method for the Iftry block is provided because of its reuse 
and 
standard functionality, the If also saves on performance as opposed to catching
 the exception, which is expensive.
        Return True if placing value in the queue was successful. Otherwise, false'''
        if put_queue.full():
            return False
        else:
            try:
                put_queue.put_nowait(value)
            except queue.Full:
                return False
            else:
                return True