Концепция локальной рабочей очереди для задач, связанных с ЦП, важна в Python из-за GIL. На SE есть очевидные ответы на этот счет. Метод подпроцессов используется для обхода отсутствия реального параллелизма, ограниченного процессором. В Python мы можем использовать класс multiprocessing.Pool, чтобы добиться именно этого. Я хотел создать универсальную одноэлементную рабочую очередь, которая могла бы принимать любую функцию и любой тип аргументов и обрабатывать ее асинхронно во время основного процесса на другом процессоре, как и должна делать рабочая очередь.Все так просто.
Только на самом деле это не так.
В основе проблемы лежит Рассол проблема.
Рассол, как я выяснил, ограничен. См. этот вопрос.
Поскольку однажды может быть код типа:
Код: Выделить всё
def NetworkClassType(topologyClass):
class Network(topologyClass):
...
Все началось с этой проблемы. Мне приходится использовать этот параметр, поскольку я стремлюсь к общему WQ, и иногда что-то происходит не в контексте, ожидаемом подпроцессом.
Затем у меня возникла проблема, когда этот код из пакет маринованных огурцов:
Код: Выделить всё
if reduce is not None:
rv = reduce(self.proto)
Код: Выделить всё
def __getattr__(self, prop):
return None
Но ладно, давайте избавимся от этой странности, удалив приведенный выше код из наших классов.
Тогда я встретил эту ошибку, у которой есть несколько предложений по ее устранению, но ни одно из них не помогло в моем случае.
На этом этапе я остановился. Я подумал про себя: «Я делаю что-то не так. Python — это зрелый язык, ориентированный на данные, с хорошо развитой эхо-системой. Обычная рабочая очередь не может быть такой сложной. Должно быть, кто-то сделал это до меня».
Чтобы было понятно, я виню здесь себя. Должно быть, я что-то пропустил. Хорошо известный пакет для WQ в Python? Может быть, многопроцессорность — не ответ? Может быть, укроп – это не ответ? может быть есть способ обойти GIL (не меняя интерпретатор)? Может быть, я где-то на SE пропустил хоть один краткий ответ на все это?
Теперь я могу продолжать и буду это делать. Решаю одну проблему за раз, пока не пойму, как достичь своей цели. Но я буду рад, если кто-нибудь покажет мне, что я не прав. На самом деле в Python существует работающая универсальная рабочая очередь (или, что еще лучше, очередь актеров), которая обрабатывает все и очень эффективна.
Я могу только надеяться.
Спасибо.
Я все еще работаю над этим проектом.
Я попробовал все приведенные выше ссылки (а затем и некоторые) и попробую чтобы понять, как заставить мой пакет WQ работать.
РЕДАКТИРОВАТЬ: Я забыл ответить на очевидный вопрос, который может возникнуть, а именно об ОС. Очевидно, что даже общий WQ может не работать в разных ОС. Моя версия предназначена для Windows 10 и выше.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -something