Добрый день господа, посоветуйте пожалуйста решение проблемы, а то что то у меня никак не получается
ДАНО: есть класс, который является своего рода средством организации вычислительного процесса, в нем могут выполняться разные сущности - юниты (все наследованы от Unit). Сам класс помимо предоставления средств регистрации, запуска, останова (и т.д.) юнитов еще инициализирует некоторую плату. Соответственно юниты через главный класс работают с различными сервисами платы. Главный класс содержит в себе реализацию паттерна «Одиночка». Так же базовый класс может назначить выполнение юнита в конкретном потоке, а может назначит его работу в своем потоке
Пример:
class A(Unit):
def init(self):
self.base = BASE()
# работает с сервисом А через self.base
class B(Unit):
def init(self):
self.base = BASE()
# работает с сервисом Б через self.base
...
class BASE(object):
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super(BASE, cls).__new__(cls)
return cls.instance
def __init__(self):
# инициализация платы
self.plata = self.plata_init() # здесь поднимается плата ...
# конект к БД
self.db = self.connect_db()
...
Иногда требуется следующее, предположим сервис Б прислал юниту B сообщение, что обновился статус. Такое событие должно быть отправлено на сервер, и, чтобы в потоке юнита сама отправка не выполнялась, передается задание в task_manager (он тоже юнит и тоже одиночка) task_manager изначально порождал отдельный поток и создавал очередь, поток читал из очереди и создавал задания (опять же юниты, которые тоже могут пользоваться self.base из базового класса), однако из-за такой задницы как GIL, такие процедуры жутко тормозят работу базового класса и основных юнитов (таких как А и B). Я хотел было попробовать модуль multiprocessing, и через очередь передавать обработку заданий в дочерний процесс (хоть там GIL не подпортит мне жизнь), но в один момент времени с платой может работать только один процесс - значит надо базовый класс поместить в shared memory, но правильно это сделать у меня не получилось, подскажите советом друзья. Рассмотрю концептуально другие решения, заранее спасибо