2015-10-19 5 views
0

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

Основываясь на другом вопросе stackoverflow, кто-то рекомендовал создать третий объект для хранения данных и получить первые два объекта с этим.

Код работает что-то вроде этого:

class Master: 
    def __init__(self): 
     self.data = [] 
    (some methods for interaction) 

class A: 
    def __init__(self, master_instance): 
     ... 
     self.master_instance = master_instance 
     (call method that randomly generates data and adds it to the master_instance data 
     , and run this for a while (essentially as long as I want this process to continue)) 
    def my_a_method(self): 
     ... 

class B: 
    def __init__(self, master_instance): 
     ... 
     self.master_instance = master_instance 
     (call method that monitors master_instance to see if object A has added any data 
     to it, and spit it out. Like above, run this for as long as I want the process 
     to continue) 
    def my_b_method(self): 
     ... 

master = Master() 
a = A(master) 
b = B(master) 

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

(Это упражнение в книге, из главы о классах, но они на самом деле не обсуждать, как это будет сделано)

+2

Вы должны быть более конкретными о том, что вы имеете в виду под " в то же время". Одна из возможностей состоит в том, чтобы заставить метод A генерировать только небольшой объем данных, а метод B потребляет только небольшой объем данных и управляет «мастером» «цикл событий», который вызывает оба метода по очереди, поэтому вы только взаимодействуете с мастер, а не объекты A и B. В любом случае, что бы вы ни делали «в одно и то же время», не должно происходить в '__init__'. – BrenBarn

ответ

3
import multiprocessing as mp 

queue = mp.Queue() 

def adder(q): # for the sake of this example, let's say we want to add squares of all numbers to the queue 
    i = 0 
    while i < 100: 
     q.put(i**2) 
     i += 1 
    q.put(None) 

def monitor(q): # monitor the queue and do stuff with the data therein 
    for e in iter(q.get, None): 
     print(e) # for now, let's just print the stuff 


a = mp.Process(target=adder, args=(queue,)) 
b = mp.Process(target=monitor, args=(queue,)) 
a.start() 
b.start() 
a.join() # wait for the process to finish 
b.join() # wait for the process to finish (both processes running simultaneously) 
a.terminate() 
b.terminate() 
+0

'i' всегда равен нулю, а его квадраты равны нулю – Pynchia

+0

@ Pynchia: хорошо поймать! Я забыл прирастить. Спасибо, что сообщили мне: – inspectorG4dget

+0

это работает с объектами? Я не совсем понимаю, как адаптировать этот код к созданию объекта, а не к вызову функции. – goodtimeslim

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