Использование concurent.futures вызывает у меня странную ошибку AttributeError на django python с каналами
Я столкнулся с проблемой, пытаясь использовать пакет concurrent.futures в python. Я работаю над сайтом, используя django и каналы для выполнения асинхронной коммуникации.
Мне нужно загрузить данные из многих url и я хочу иметь возможность сделать это с помощью мультипроцессинга.
К сожалению, я не могу заставить этот код работать, так как он всегда выдает ошибку AttributeError. Может ли это быть связано с архитектурой django или каналов? Я использую ProcessPoolExecutor в функции channel receive() внутри WebSocket Object.
Вот пример моего кода :
class CreateValuesConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
pass
def create_single_value(self, card):
print('start create_single_value')
condition = Condition.objects.filter(short_name='NM')[0]
card_language = Language.objects.filter(short_name='FR')[0]
seller_origin = Language.objects.filter(short_name='FR')[0]
value = card.create_value(condition, card_language, seller_origin)
if value is not None:
message = "models.value." + str(value.id) + ' : create | card_name = ' \
+ card.name_en.lower() + " | price = " + str(value.cheaper_price)
is_error = 0
else:
error = ParsingError.objects.filter(card=card)[0]
message = error.message
is_error = 1
self.send(text_data=json.dumps({
'message': message,
'is_error': is_error
}))
print('end')
def receive(self, text_data):
json_data = json.loads(text_data)
extension = Extension.objects.get(pk=json_data["id"])
cards_to_value = Card.objects.filter(extension=extension)
today = datetime.now()
for card in cards_to_value:
values = Value.objects.filter(card=card, date__year=today.year, date__month=today.month, date__day=today.day)
for value in values:
print('delete' + str(value.pk))
value.delete()
if len(cards_to_value) > 0:
futures = []
with concurrent.futures.ProcessPoolExecutor() as executor:
for card in cards_to_value:
futures.append(executor.submit(self.create_single_value, card=card))
for future in concurrent.futures.as_completed(futures):
print(str(future.result))
print(str(future.exception()))
Вот ошибки, которые появляются при выполнении :
<bound method Future.result of <Future at 0x1bafbc283a0 state=finished raised AttributeError>>
Can't pickle local object 'convert_exception_to_response.<locals>.inner'
Я полагаю, что объект 'convert_exception_to_response..inner' - это объект django или channels, но если у кого-то есть идеи по решению, я буду рад их услышать :)
Спасибо