Передача данных между многопроцессорными процессами

Поскольку данные чувствительны при обращении между двумя потоками (думаю, что одновременное чтение и параллельная запись могут конфликтовать друг с другом, вызывая условия гонки), был создан набор уникальных объектов, чтобы облегчить передачу данных назад и вперед между потоками. Любая действительно атомарная операция может использоваться между потоками, но всегда безопасно придерживаться очереди.

 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

 

Большинство людей предлагают, чтобы при использовании очереди всегда помещать данные очереди в блок try: exception: вместо использования empty. Однако, для применений , где это не имеет значения , если вы пропустите цикл сканирования (данные могут быть помещены в очередь , пока она подбрасывает состояния от queue.Empty==True для queue.Empty==False ) обычно лучше разместить чтения и записать доступ в то, что я называю блоком Iftry, потому что оператор if более технически эффективен, чем перехват исключения.

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