2013-03-21 2 views
1

У меня нет большого опыта работы с многопоточностью, и я пытаюсь получить что-то вроде ниже работы:Как обмениваться деревом объектов с вилкой процесса?

from multiprocessing import Process 

class Node: 

    def __init__(self): 
     self.children = {} 

class Test(Process): 

    def __init__(self, tree): 
     super().__init__() 
     self.tree = tree 

    def run(self): 
     # infinite loop which does stuff to the tree 
     self.tree.children[1] = Node() 
     self.tree.children[2] = Node() 

x = Node() 
t = Test(x) 
t.start() 
print(x.children) # random access to tree 

Я понимаю, что это не должно (и не) работать на различных очень разумные причины, но я не уверен, как это получить до работы. Ссылаясь на документацию, мне кажется, что мне нужно что-то делать с менеджерами и прокси, но я честно понятия не имею, с чего начать, или действительно ли это то, что я ищу. Может ли кто-нибудь представить пример выше, который работает?

+0

Вы хотите многопоточность (один процесс, несколько потоков, общее адресное пространство) или многопроцессорность (несколько процессов, без общего адресного пространства)? Какова проблема более высокого уровня, которую вы хотите решить? –

+0

Я хочу многопоточность, но обходя проблему PILON GIL. Может быть, я прошу слишком много ... – darkfeline

ответ

2

multiprocessing имеет ограниченную поддержку implicitly shared objects, которая может даже делиться списками и диктофонами.

В общем, multiprocessing является shared-nothing (после начальной вилки) и полагается на явное сообщение между процессами. Это добавляет накладные расходы (насколько это действительно зависит от типа взаимодействия между процессами), но аккуратно избегает многих проблем многопоточного программирования. Высокоуровневые строительные блоки multiprocessing способствуют моделям master/slave (например, Pool class), при этом мастера выдают рабочие элементы и подчиненные им операторы, возвращая результаты.

Сохранение состояния в синхронизации по нескольким процессам может, в зависимости от того, как часто они меняются, несут чрезмерные издержки.

TL; DR: Это можно сделать, но, вероятно, этого не должно быть.

import time, multiprocessing 

class Test(multiprocessing.Process): 
    def __init__(self, manager): 
     super().__init__() 
     self.quit = manager.Event() 
     self.dict = manager.dict() 

    def stop(self): 
     self.quit.set() 
     self.join() 

    def run(self): 
     self.dict['item'] = 0 
     while not self.quit.is_set(): 
      time.sleep(1) 
      self.dict['item'] += 1 

m = multiprocessing.Manager() 
t = Test(m) 
t.start() 
for x in range(10): 
    time.sleep(1.2) 
    print(t.dict) 
t.stop() 

В multiprocessing примерах показано, как создать прокси для более complicated objects, что должно позволить вам реализовать структуру дерева в вашем вопросе.

2

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

Смежные вопросы