LINUX.ORG.RU

multiprocessing - проблема с расшариванием переменных между процессами

 


1

1

Добрый день

В программе необходимо иметь общую переменную, в данном случае список deque, между процессами. При использовании модуля multiprocessing, каждый процесс работает с отдельной копией списка, не используя общую переданную переменную. При использовании модуля threading.Thread каждый поток работает с общим списком, так как нужно. В программе необходимо использовать именно модуль multiprocessing. Прошу подсказать как расшарить переменную между процессами модуля multiprocessing.

# -*- coding: utf-8 -*-

import multiprocessing as mp
import threading
import time
import random

from collections import deque


class ManageUpdate(mp.Process):
# class ManageUpdate(threading.Thread):
    def __init__(self, queue, condition):
        # threading.Thread.__init__(self)
        mp.Process.__init__(self)
        self.queue = queue
        self.condition = condition

    def run(self):
        while True:
            rand_data = '%d' % random.randint(0, 256)
            self.condition.acquire()
            print 'condition acquire by %s' % self.name
            self.queue.append(rand_data)
            print 'after change', self.queue
            print '===' * 10
            print '\n'
            self.condition.notify()
            self.condition.release()
            time.sleep(random.random())
            
            

if __name__ == '__main__':
    condition = mp.Condition()
    d = deque(maxlen=9)
    d.append('CHECK CHECK CHECK')
    
    for count in range(5):
        worker = ManageUpdate(d, condition)
        worker.daemon = True
        worker.start()
        time.sleep(3)

Для начала узнай разницу между процессом и потоком. Потом погугли передачу данных между процессами и найди массу вариантов.

Lilly
()
Ответ на: комментарий от tailgunner

Хотелось бы узнать в такой формулировке, но если сможете предложить другую, то буду очень благодарен.

bohrman
() автор топика
Ответ на: комментарий от bohrman

Ты хочешь, чтобы задачу решили именно в такой формулировке?

Хотелось бы узнать в такой формулировке, но если сможете предложить другую

По сути, твоя формулировка - это не формулировка задачи, а формулировка решения какой-то другой задачи, и это решение ты хочешь натянуть на multiprocessing. Хотелось бы узнать формулировку той, другой задачи, или хотя бы понять, зачем тебе общий дек.

tailgunner ★★★★★
()

никак. используй механизмы межпроцессной коммуникации

anonymous
()
Ответ на: комментарий от bohrman

В смысле без consumer? Просто кидать данные в список из разных процессов? А смысл? Или это задача синтетическая? Если да, то кидаешь этот список в разделяемую память, например, но я не в курсе, как с этим у пайтона именно.

Уже сказали, постановка задачи несколько, кхм, странная.

И да, почему не на тройке?

Lilly
()
Ответ на: комментарий от Lilly

p.s. Погуглил немного: в доках довольно хорошо расписано - тык.

Lilly
()

Читай про очереди ( multiprocessing.Queue ) и каналы ( multiprocessing.Pipe )

Rodegast ★★★★★
()
Ответ на: комментарий от tailgunner

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

bohrman
() автор топика
Ответ на: комментарий от bohrman

По факту хочу рассмотреть вариант кэша между потоками, где в каждом потоке будет производиться определенное вычисление и результат помещаться в эту общую очередь, но перед началом вычисления смотреть ее на наличие, а было ли уже подобное вычисление

Обычно есть центральный процесс-менеджер и несколько рабочих процессов. Почему бы не проверять наличие произведенного вычисления в менеджере и, при его отсутствии, отдавать задачу рабочему процессу? Тогда доступ к очереди произведенных вычислений нужен только менеджеру.

tailgunner ★★★★★
()

На будущее, если надо шарить переменную между процессами. Просто объявляешь ее в процессе:

value = Value('i', 0)
А это если словарь:
manager = Manager()
liq_dict = manager.dict()
Value и Manager есть в модуле multiprocessing.
А по факту что-то лень разбираться, чего ты там хочешь в коде.

FIL ★★★★
()
Последнее исправление: FIL (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.