Рабочая очередь в Python – я что-то упустил?Python

Программы на Python
Anonymous
Рабочая очередь в Python – я что-то упустил?

Сообщение Anonymous »

Это может быть помечено как дублированное или неактуальное. Но я на самом деле считаю, что этот вопрос важен как для меня, так и для будущих неопытных разработчиков Python.
Концепция локальной рабочей очереди для задач, связанных с ЦП, важна в Python из-за GIL. На SE есть очевидные ответы на этот счет. Метод подпроцессов используется для обхода отсутствия реального параллелизма, ограниченного процессором. В Python мы можем использовать класс multiprocessing.Pool, чтобы добиться именно этого. Я хотел создать универсальную одноэлементную рабочую очередь, которая могла бы принимать любую функцию и любой тип аргументов и обрабатывать ее асинхронно во время основного процесса на другом процессоре, как и должна делать рабочая очередь.Все так просто.
Только на самом деле это не так.
В основе проблемы лежит Рассол проблема.
Рассол, как я выяснил, ограничен. См. этот вопрос.
Поскольку однажды может быть код типа:

Код: Выделить всё

def NetworkClassType(topologyClass):
class Network(topologyClass):
...
Pickle не подходит для общей рабочей очереди. Итак, я узнал, что могу использовать укроп. Тем не менее, я продолжал сталкиваться с рядом проблем, которые мне нужно было решить.
Все началось с этой проблемы. Мне приходится использовать этот параметр, поскольку я стремлюсь к общему WQ, и иногда что-то происходит не в контексте, ожидаемом подпроцессом.
Затем у меня возникла проблема, когда этот код из пакет маринованных огурцов:

Код: Выделить всё

if reduce is not None:
rv = reduce(self.proto)
возвращает исключение TypeError: объект «NoneType» не может быть вызван, и выяснить причину этого было кошмаром. Оказывается, следующий код нарушает оператор if, когда вы помещаете его в маринованный класс (даже в dill):

Код: Выделить всё

def __getattr__(self, prop):
return None
что по сути означает, что вам не нужны никакие исключения при попытке получить свойство, которое не было определено в __dict__ класса. Оказывается, рассол и укроп не могут справиться с этим кодом. Уже существует общая идея WQ.
Но ладно, давайте избавимся от этой странности, удалив приведенный выше код из наших классов.
Тогда я встретил эту ошибку, у которой есть несколько предложений по ее устранению, но ни одно из них не помогло в моем случае.
На этом этапе я остановился. Я подумал про себя: «Я делаю что-то не так. Python — это зрелый язык, ориентированный на данные, с хорошо развитой эхо-системой. Обычная рабочая очередь не может быть такой сложной. Должно быть, кто-то сделал это до меня».
Чтобы было понятно, я виню здесь себя. Должно быть, я что-то пропустил. Хорошо известный пакет для WQ в Python? Может быть, многопроцессорность — не ответ? Может быть, укроп – это не ответ? может быть есть способ обойти GIL (не меняя интерпретатор)? Может быть, я где-то на SE пропустил хоть один краткий ответ на все это?
Теперь я могу продолжать и буду это делать. Решаю одну проблему за раз, пока не пойму, как достичь своей цели. Но я буду рад, если кто-нибудь покажет мне, что я не прав. На самом деле в Python существует работающая универсальная рабочая очередь (или, что еще лучше, очередь актеров), которая обрабатывает все и очень эффективна.
Я могу только надеяться.
Спасибо.
Я все еще работаю над этим проектом.
Я попробовал все приведенные выше ссылки (а затем и некоторые) и попробую чтобы понять, как заставить мой пакет WQ работать.
РЕДАКТИРОВАТЬ: Я забыл ответить на очевидный вопрос, который может возникнуть, а именно об ОС. Очевидно, что даже общий WQ может не работать в разных ОС. Моя версия предназначена для Windows 10 и выше.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -something

Вернуться в «Python»