Как обмениваться данными между процессами Python?

Я использую многопроцессорность для создания подпроцесса в моем приложении Python. Я хотел бы поделиться данными между моим родительским и дочерним процессами. Важно отметить, что мне нужно поделиться этим асинхронно, это означает, что дочерний процесс и родительский процесс будут обновлять данные во время выполнения кода.

Как лучше всего это сделать?


person Dan    schedule 02.02.2016    source источник
comment
как вы создаете подпроцесс?   -  person AlokThakur    schedule 02.02.2016
comment
Это зависит от типа данных, которыми вы хотите поделиться, и от кода, который вы используете. Можете ли вы привести минимальный пример того, что вы хотели / сделали?   -  person CoMartel    schedule 02.02.2016


Ответы (2)


Это один простой пример из документации Python -

from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()

Вы также можете использовать канал. Дополнительные сведения см. В https://docs.python.org/2/library/multiprocessing.html

person AlokThakur    schedule 02.02.2016
comment
Спасибо! Как я могу проверить, изменилось ли что-то в переменных Queue или PIPE, и затем выполнить какое-то действие? - person Dan; 02.02.2016
comment
Очередь и канал не являются переменными, а являются связями между процессами. Вы можете отправлять и получать переменные через него - person CoMartel; 02.02.2016
comment
@Dan, вы можете сослаться на раздел общей памяти ссылки, которой я поделился - person AlokThakur; 02.02.2016
comment
@alokthkur, если я хочу передать огромные объемы данных в памяти другому процессу для анализа (т.е. содержимого файла), как я могу передать его без копирования данных? любая идея, как я могу поделиться данными и передать только указатель как argv? - person Zohar81; 15.11.2018

Вот пример многопроцессорной многопоточности и совместного использования пары переменных:

from multiprocessing import Process, Queue, Value, Manager
from ctypes import c_bool
from threading import Thread


ps = []

def yourFunc(var1, var2, pause, budget):
    while True:
        print(budget.value, pause.value)
        ##set value
        pause.value = True  
        ....

def multiProcess(distributor, threads, pause, budget):
    for _ in range(threads):
        t = Thread(target=yourFunc(), args=([1,2],None, distributor, pause, budget,)) 
        t.start()
        ts.append(t)
        time.sleep(3)

if __name__ == '__main__':
    pause = Value(c_bool, False)
    budget = Value('i', 5000)

    for i in range(2):
        p = Process(target=multiProcess, args=('distributor', 2, pause, budget))
        p.start()
        ps.append(p) 
person grantr    schedule 05.05.2021