Nó phụ thuộc chính xác đến mức bạn muốn công việc của mình được lên lịch. Có một vài cơ chế:
This blog có một trick gọn gàng cho việc sử dụng gevent.spawn_later
để tạo ra một bộ đếm thời gian:
def schedule(delay, func, *args, **kw_args):
gevent.spawn_later(0, func, *args, **kw_args)
gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args)
Hoặc tất nhiên bạn chỉ có thể ngủ trong một vòng lặp mà có lẽ dễ đọc hơn:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
gevent.sleep(interval)
function(*args, **kwargs)
Tuy nhiên, cả hai điều này sẽ trôi qua theo thời gian, đặc biệt nếu chức năng của bạn cần thời gian để hoàn thành tương ứng với khoảng thời gian. Bạn có thể bù đắp bằng cách điều chỉnh khoảng thời gian ngủ vào thời điểm các chức năng cần thiết để thực hiện:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
before = time.time()
function(*args, **kwargs)
duration = time.time() - before
if duration < interval:
gevent.sleep(interval-duration)
else:
warning("function %s duration exceeded %f interval (took %f)" % (
function.__name__, interval, duration))
này sẽ vẫn trôi, chỉ cần không phải là khá nhiều ...
Hmm, tại sao greenlet lặp lại vô tận, gọi điện thoại và ngủ, không đủ? –
Tôi sử dụng điều này trong gunicorn vì vậy nó là máy chủ web, và tôi không biết làm thế nào để làm điều đó. Tôi chỉ có chức năng xử lý, nhưng tôi có lẽ có thể chèn mã đó trước đó. Dường như không tốt để làm điều đó bởi vì nếu tôi cần 10 giờ, tôi cần 10 cuộc gọi lại. Điều đó thậm chí có hiệu quả với gunicorn không? – bradojevic