Как я могу передать анонимную функцию в задачу Celery? (Или выполнить мою цель другим способом?) - PullRequest
0 голосов
/ 26 октября 2019

У меня есть задача загрузки файла Celery. Несколько задач в моем основном приложении будут использовать эту задачу, и я пытаюсь абстрагировать ее, чтобы одну и ту же задачу можно было использовать для разных целей. В один момент в моей задаче у меня было

 if r.ok:
        results = [result for result in r.json()['ResultSet']['Result']
                   if all([condition(result) for condition in conditions])]

И я думал, что собираюсь быть умным и передать его

conditions=[lambda result: 'json' not in result['Name']]

Только я не могу, потому что это заставляет меня говорить об ошибкемне, что объекты типа функции не сериализуемы.

На данный момент я изменил строку в задаче на:

 if r.ok:
        results = [result for result in r.json()['ResultSet']['Result']
                   if all([excluded not in result[attr] for attr, excluded in exclusions.items()])]

И я передаю ее exclusions={'Name':'json'}.

Будет очень обидно, если я начну хотеть исключать файлы по другим причинам, кроме того, что в некоторых аспектах ответа нет конкретной текстовой строки. Я задавался вопросом, есть ли у кого-нибудь идеи для сериализуемой версии моего сильно обобщенного параметра условий.

1 Ответ

1 голос
/ 27 октября 2019

Единственный способ сделать это - передать имя функции, которую вы хотите запустить, в виде строки и иметь предопределенный набор функций, существующих на ваших рабочих, чтобы они знали, что нужно запускать. Вы слишком много просите о распределенной системе.

...