在我问之前, Cron Jobs和Task Scheduler 将是我的最后选择,这个脚本将在Windows和Linux上使用,我更喜欢使用编码方法来执行此操作而不是留给最终用户完成。
是否有可用于安排任务的Python库?我需要每小时运行一次函数,但是,如果我每小时运行一次脚本并使用.sleep,"每小时一次"由于执行/运行脚本和/或功能所固有的延迟,它将在前一天的不同时间运行。
什么是最佳方式来安排函数在一天中的特定时间(不止一次)运行没有使用Cron作业或使用任务计划程序安排它?
或者如果无法做到这一点,我也希望你提供意见。
import datetime
import time
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.daemonic = False
sched.start()
def job_function():
print("Hello World")
print(datetime.datetime.now())
time.sleep(20)
# Schedules job_function to be run once each minute
sched.add_cron_job(job_function, minute='0-59')
出:
>Hello World
>2014-03-28 09:44:00.016.492
>Hello World
>2014-03-28 09:45:00.0.14110
(来自Animesh Pandey的回答)
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched.configure(options_from_ini_file)
sched.start()
答案 0 :(得分:45)
也许这可以提供帮助:Advanced Python Scheduler
以下是他们文档中的一小段代码:
from apscheduler.schedulers.blocking import BlockingScheduler
def some_job():
print "Decorated job"
scheduler = BlockingScheduler()
scheduler.add_job(some_job, 'interval', hours=1)
scheduler.start()
答案 1 :(得分:20)
每小时每10分钟运行一次。
from datetime import datetime, timedelta
while 1:
print 'Run something..'
dt = datetime.now() + timedelta(hours=1)
dt = dt.replace(minute=10)
while datetime.now() < dt:
time.sleep(1)
答案 2 :(得分:16)
apscheduler
&lt; 3.0,请参阅Unknown's answer。
apscheduler
&gt; 3.0
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched.configure(options_from_ini_file)
sched.start()
apscheduler
documentation。
这适用于apscheduler-3.3.1
上的Python 3.6.2
。
"""
Following configurations are set for the scheduler:
- a MongoDBJobStore named “mongo”
- an SQLAlchemyJobStore named “default” (using SQLite)
- a ThreadPoolExecutor named “default”, with a worker count of 20
- a ProcessPoolExecutor named “processpool”, with a worker count of 5
- UTC as the scheduler’s timezone
- coalescing turned off for new jobs by default
- a default maximum instance limit of 3 for new jobs
"""
from pytz import utc
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ProcessPoolExecutor
"""
Method 1:
"""
jobstores = {
'mongo': {'type': 'mongodb'},
'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
'default': {'type': 'threadpool', 'max_workers': 20},
'processpool': ProcessPoolExecutor(max_workers=5)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
"""
Method 2 (ini format):
"""
gconfig = {
'apscheduler.jobstores.mongo': {
'type': 'mongodb'
},
'apscheduler.jobstores.default': {
'type': 'sqlalchemy',
'url': 'sqlite:///jobs.sqlite'
},
'apscheduler.executors.default': {
'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
'max_workers': '20'
},
'apscheduler.executors.processpool': {
'type': 'processpool',
'max_workers': '5'
},
'apscheduler.job_defaults.coalesce': 'false',
'apscheduler.job_defaults.max_instances': '3',
'apscheduler.timezone': 'UTC',
}
sched_method1 = BlockingScheduler() # uses overrides from Method1
sched_method2 = BlockingScheduler() # uses same overrides from Method2 but in an ini format
@sched_method1.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched_method2.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched_method1.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
sched_method1.start()
sched_method2.configure(gconfig=gconfig)
sched_method2.start()
答案 3 :(得分:1)
在sunshinekitty发布的名为“Version&lt; 3.0”的版本中,您可能需要指定apscheduler 2.1.2。我在2.7安装时偶然遇到了版本3,所以我去了:
pip uninstall apscheduler
pip install apscheduler==2.1.2
之后它正常工作。希望有所帮助。
答案 4 :(得分:0)
答案 5 :(得分:0)
一种选择是编写一个定期执行python脚本的C / C ++包装器。您的最终用户将运行C / C ++可执行文件,该文件将继续在后台运行,并定期执行python脚本。这可能不是最佳解决方案,如果您不了解C / C ++或想要保持这种100%python,则可能无效。但它似乎是最用户友好的方法,因为人们习惯于点击可执行文件。所有这些都假定python已安装在最终用户的计算机上。
另一个选择是使用cron作业/任务计划程序,但要将其作为脚本放入安装程序中,以便最终用户不必这样做。
答案 6 :(得分:0)
#For scheduling task execution
import schedule
import time
def job():
print("I'm working...")
schedule.every(1).minutes.do(job)
#schedule.every().hour.do(job)
#schedule.every().day.at("10:30").do(job)
#schedule.every(5).to(10).minutes.do(job)
#schedule.every().monday.do(job)
#schedule.every().wednesday.at("13:15").do(job)
#schedule.every().minute.at(":17").do(job)
while True:
schedule.run_pending()
time.sleep(1)
答案 7 :(得分:0)
我建议的最简单的选择是使用schedule库。
在您的问题中,您说“我需要每小时运行一次函数” 这样做的代码很简单:
import schedule
def thing_you_wanna_do():
...
...
return
schedule.every().hour.do(thing_you_wanna_do)
while True:
schedule.run_pending()
您还询问了一天中特定时间的操作方法 如何做到这一点的一些例子是:
import schedule
def thing_you_wanna_do():
...
...
return
schedule.every().day.at("10:30").do(thing_you_wanna_do)
schedule.every().monday.do(thing_you_wanna_do)
schedule.every().wednesday.at("13:15").do(thing_you_wanna_do)
# If you would like some randomness / variation you could also do something like this
schedule.every(1).to(2).hours.do(thing_you_wanna_do)
while True:
schedule.run_pending()
所用代码的90%是schedule库的示例代码。调度愉快!
答案 8 :(得分:0)
每小时每15分钟运行一次脚本。 例如,您希望收到15分钟的股票报价,该报价每15分钟更新一次。
while True:
print("Update data:", datetime.now())
sleep = 15 - datetime.now().minute % 15
if sleep == 15:
run_strategy()
time.sleep(sleep * 60)
else:
time.sleep(sleep * 60)
答案 9 :(得分:0)
可能您已经有了@lukik解决方案,但是如果您想删除计划,则应该使用:
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
或
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')
如果您需要使用明确的工作ID
有关更多信息,您应该检查:https://apscheduler.readthedocs.io/en/stable/userguide.html#removing-jobs
答案 10 :(得分:0)
我发现调度程序需要每秒运行一次程序。如果使用在线服务器,这将是昂贵的。 所以我有以下几点:
它在每分钟第 5 秒运行,您可以通过重新计算以秒为单位的等待时间将其更改为小时天
import time
import datetime
Initiating = True
print(datetime.datetime.now())
while True:
if Initiating == True:
print("Initiate")
print( datetime.datetime.now())
time.sleep(60 - time.time() % 60+5)
Initiating = False
else:
time.sleep(60)
print("working")
print(datetime.datetime.now())