【发布时间】:2021-07-30 02:21:07
【问题描述】:
我有一个向RabbitMQ 队列发送消息的视图。
message = {'origin': 'Bytes CSV',
'data': {'csv_key': str(csv_entry.key),
'csv_fields': csv_fields
'order_by': order_by,
'filters': filters}}
...
queue_service.send(message=message, headers={}, exchange_name=EXCHANGE_IN_NAME,
routing_key=MESSAGES_ROUTING_KEY.replace('#', 'bytes_counting.create'))
在我的消费者身上,我有一个很长的过程来生成 CSV。
def create(self, data):
csv_obj = self._get_object(key=data['csv_key'])
if csv_obj.status == CSVRequestStatus.CANCELED:
self.logger.info(f'CSV {csv_obj.key} was canceled by the user')
return
result = self.generate_result_data(filters=data['filters'], order_by=data['order_by'], csv_obj=csv_obj)
csv_data = self._generate_csv(result=result, csv_fields=data['csv_fields'], csv_obj=csv_obj)
file_key = self._post_csv(csv_data=csv_data, csv_obj=csv_obj)
csv_obj.status = CSVRequestStatus.READY
csv_obj.status_additional = CSVRequestStatusAdditional.SUCCESS
csv_obj.file_key = file_key
csv_obj.ready_at = timezone.now()
csv_obj.save(update_fields=['status', 'status_additional', 'ready_at', 'file_key'])
self.logger.info(f'CSV {csv_obj.name} created')
长过程发生在self._generate_csv 内部,因为self.generate_result_data 返回一个queryset,这是惰性的。
如您所见,如果用户在消息开始被消费之前通过端点更改csv_request 的状态,则不会评估进程。我的目标是在执行self._generate_csv 期间让这种情况发生。
到目前为止,我尝试使用Threading,但没有成功。
我怎样才能实现我的目标?
非常感谢!
【问题讨论】:
-
"我的目标是在执行 self._generate_csv 期间让这种情况发生。"你这是什么意思?
-
@LordElrond 如果
csv_obj状态更改为CSVRequestStatus.CANCELED,我想停止执行此函数(即使它已经启动)。
标签: python django multithreading rabbitmq