2012-07-17 35 views
9

Làm cách nào để chạy hàm trong Python, tại một thời điểm nhất định?Python - Bắt đầu một hàm tại thời điểm đã cho

Ví dụ:

run_it_at(func, '2012-07-17 15:50:00') 

và nó sẽ chạy chức năng func tại 2012/07/17 15:50:00.

Tôi đã thử số sched.scheduler, nhưng nó không bắt đầu chức năng của tôi.

import time as time_module 
scheduler = sched.scheduler(time_module.time, time_module.sleep) 
t = time_module.strptime('2012-07-17 15:50:00', '%Y-%m-%d %H:%M:%S') 
t = time_module.mktime(t) 
scheduler_e = scheduler.enterabs(t, 1, self.update,()) 

Tôi có thể làm gì?

+1

Hệ điều hành nào? Bạn có thể sẽ cần phải chạy nó với một chương trình bên ngoài để python, chẳng hạn như cron trên Unix. –

+0

Tại sao không? Bạn đã đặt độ trễ nào cho 'enter' (giả sử đó là những gì bạn đã thử)? –

+0

Bạn đã cố gắng sử dụng 'sched.scheduler' như thế nào? – geoffspear

Trả lời

11

Đọc các tài liệu từ http://docs.python.org/py3k/library/sched.html:

Đi từ mà chúng ta cần phải làm việc ra một sự chậm trễ (tính bằng giây) ...

from datetime import datetime 
now = datetime.now() 

Sau đó sử dụng để phân tích datetime.strptime '2012/07/17 15 : 50: 00' (tôi sẽ rời khỏi chuỗi định dạng cho bạn)

# I'm just creating a datetime in 3 hours... (you'd use output from above) 
from datetime import timedelta 
run_at = now + timedelta(hours=3) 
delay = (run_at - now).total_seconds() 

sau đó bạn có thể sử dụng để vượt qua delay vào một trường hợp threading.Timer, ví dụ:

threading.Timer(delay, self.update).start() 
+2

Số giờ học trên giờ địa phương có thể thất bại nếu độ lệch utc của múi giờ địa phương đã thay đổi giữa 'now' và' run_at', ví dụ, xung quanh chuyển tiếp DST. Chuyển đổi giờ địa phương thành dấu thời gian UTC hoặc POSIX để thực hiện các phép tính. Xem [Tìm nếu 24 giờ đã trôi qua giữa các thời gian biểu - Python] (http://stackoverflow.com/a/26313848/4279). – jfs

+0

Bạn có thể sử dụng 'total_seconds' trực tiếp trên' timedelta': 'datetime.timedelta (giờ = 3) .total_seconds()' – Spela

13

Hãy nhìn vào Advanced Python Scheduler, APScheduler: http://packages.python.org/APScheduler/index.html

Họ có một ví dụ cho chỉ usecase này: http://packages.python.org/APScheduler/dateschedule.html

from datetime import date 
from apscheduler.scheduler import Scheduler 

# Start the scheduler 
sched = Scheduler() 
sched.start() 

# Define the function that is to be executed 
def my_job(text): 
    print text 

# The job will be executed on November 6th, 2009 
exec_date = date(2009, 11, 6) 

# Store the job in a variable in case we want to cancel it 
job = sched.add_date_job(my_job, exec_date, ['text']) 
+1

không hoạt động trên python 3 – Anarach

2

Tôi chạy vào cùng một vấn đề: tôi có thể không nhận được sự kiện thời gian tuyệt đối đã đăng ký với sched.enterabs để được công nhận bởi sched.run. sched.enter đã làm việc cho tôi nếu tôi tính toán delay, nhưng rất khó sử dụng vì tôi muốn công việc chạy vào những thời điểm cụ thể trong ngày trong các múi giờ cụ thể.

Trong trường hợp của tôi, tôi thấy rằng vấn đề này là mặc định timefunc trong sched.scheduler initializer không phải là time.time (như trong example), mà đúng hơn là time.monotonic. time.monotonic không có ý nghĩa về lịch trình thời gian "tuyệt đối", từ docs, "Điểm tham chiếu của giá trị trả về không xác định, do đó chỉ khác biệt giữa kết quả của cuộc gọi liên tiếp là hợp lệ."

Các giải pháp đối với tôi là để khởi tạo lên lịch như

scheduler = sched.scheduler(time.time, time.sleep)

Đó là chưa rõ liệu time_module.time của bạn là thực sự time.time hoặc time.monotonic, nhưng nó hoạt động tốt khi tôi khởi tạo nó đúng cách .

1
dateSTR = datetime.datetime.now().strftime("%H:%M:%S") 
if dateSTR == ("20:32:10"): 
    #do function 
    print(dateSTR) 
else: 
    # do something useful till this time 
    time.sleep(1) 
    pass 

Chỉ cần tìm kiếm một Time of Day/ngày kích hoạt sự kiện: càng lâu càng ngày "chuỗi" được gắn với một "thời gian" được cập nhật chuỗi, nó hoạt động như một hàm TOD đơn giản. Bạn có thể mở rộng chuỗi ra ngày và giờ.

cho dù thứ tự từ điển hoặc so sánh thứ tự thời gian của nó, miễn là chuỗi đại diện cho một điểm trong thời gian, chuỗi cũng sẽ như vậy.

một ai đó vui lòng cung cấp liên kết này:

String Comparison Technique Used by Python

1

Có thể là giá trị cài đặt thư viện này: https://pypi.python.org/pypi/schedule, về cơ bản giúp làm tất cả mọi thứ bạn vừa mô tả. Dưới đây là ví dụ:

import schedule 
import time 

def job(): 
    print("I'm working...") 

schedule.every(10).minutes.do(job) 
schedule.every().hour.do(job) 
schedule.every().day.at("10:30").do(job) 
schedule.every().monday.do(job) 
schedule.every().wednesday.at("13:15").do(job) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 
Các vấn đề liên quan