Справочная информация: Поскольку Python по своей природе является однопоточным (интерпретатор защищен GIL или глобальной блокировкой интерпретатора), в нем нет истинных потоков.Вместо этого, чтобы достичь того же эффекта, вы должны использовать разные процессы, как вы делаете в своем примере.Поскольку это разные процессы с разными интерпретаторами и разными пространствами имен, вы не сможете получить доступ к обычным данным в одном процессе из другого процесса.Когда вы создаете новый процесс, интерпретатор Python разветвляется и создает копию всех объектов Python, поэтому Car.car_list теперь представляет собой два разных объекта, по одному в каждом процессе.Поэтому, когда один процесс добавляет в этот список, он добавляет в другой список, чем другой процесс читает.
Ответ: Ваша догадка была правильной: вы захотите использовать один изструктуры данных в многопроцессорном модуле.Эти структуры данных специально написаны так, чтобы они были «потокобезопасными» (я полагаю, что в этом контексте «безопасными для процессов») и чтобы распределять общие данные между двумя процессами за кулисами.
Пример: вы можете использовать глобальную очередь, в которой процесс «производитель» добавляет элементы, а процесс «потребитель» удаляет их и добавляет их в свою собственную копию списка.
from multiprocessing import Queue
class Car:
global_queue = Queue()
_car_list = [] # This member will be up-to-date in the producer
# process. In that process, access it directly.
# In the consumer process, call get_car_list instead.
# This can be wrapped in an interface which knows
# which process it is in, so the calling code does
# not have to keep track.
def __init__(self, id, model):
self.id = id
self.model = model
self.global_queue.put(self)
self._car_list.append(self)
@classmethod
def get_car_list(cls):
""" Get the car list for the consumer process
Note: do not call this from the producer process
"""
# Before returning the car list, pull all pending cars off the queue
# while cls.global_queue.qsize() > 0:
# qsize is not implemented on some unix systems
while not cls.global_queue.empty():
cls._car_list.append(cls.global_queue.get())
return cls._car_list
Примечание.код, вы можете иметь только один потребитель данных.Если другие процессы вызывают метод get_car_list, они удаляют ожидающие автомобили из очереди, и потребительский процесс не получит их.Если вам нужно иметь несколько пользовательских процессов, вам потребуется другой подход.