Tôi đang làm việc trên một ứng dụng Django. Tôi có một điểm cuối API, nếu được yêu cầu, phải thực hiện một hàm phải được lặp lại một vài lần (cho đến khi một điều kiện nhất định là đúng). Cách tôi giải quyết vấn đề này ngay bây giờ là -Django - chạy một hàm mỗi x giây
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
Trong khi tôi biết rằng đây là một cách tiếp cận khủng khiếp và tôi không nên chặn trong 2 giây, tôi không thể tìm ra cách để tránh .
Tác phẩm này hoạt động sau khi đợi 4 giây. Nhưng tôi muốn một cái gì đó mà giữ vòng lặp chạy trong nền, và dừng lại khi some_fn trả về True. (Ngoài ra, chắc chắn rằng some_fn sẽ trả về True)
EDIT -
Đọc phản hồi của Oz123 đã cho tôi ý tưởng dường như hoạt động. Dưới đây là những gì tôi đã làm -
def shut_down(params):
# Do some stuff
# Offload the blocking job to a new thread
t = threading.Thread(target=some_fn, args=(id,), kwargs={})
t.setDaemon(True)
t.start()
return True
def some_fn(id):
while True:
# Do the job, get result in res
# If the job is done, return. Or sleep the thread for 2 seconds before trying again.
if res:
return
else:
time.sleep(2)
Điều này thực hiện công việc cho tôi. Nó đơn giản nhưng tôi không biết làm thế nào đa luồng hiệu quả là kết hợp với Django.
Nếu bất cứ ai có thể chỉ ra những cạm bẫy của điều này, những lời chỉ trích được đánh giá cao.
Bạn có thể sử dụng cần tây cho việc này. Bạn có thể tìm hướng dẫn sử dụng tại đây: https://realpython.com/blog/python/asynchronous-tasks-with-django-and-celery/#periodic-tasks – neverwalkaloner
@neverwalkaloner nghe giống như chính xác những gì tôi cần. Sẽ cố gắng sử dụng nó, cảm ơn. :) – Zeokav
Như đã đề cập bởi @neverwalkaloner, bạn có thể sử dụng cần tây, bạn có thể thiết lập nhiệm vụ định kỳ với lịch biểu, kiểm tra tài liệu là rất linh hoạt http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html cung cấp cho nó một cái nhìn để mô-đun crontab. –