else: log.info('The job worked :)') scheduler.add_listener( scheduler_event_listener, apscheduler.events.EVENT_JOB_EXECUTED | apscheduler.events.EVENT_JOB_ERROR) @scheduler.task(trigger='interval', seconds=60) def tick(): print('Tick! The time is: %s' % datetime.datetime.now()) log.info('jobs added', count=len(scheduler.get_jobs())) @app.route('/') def root(): return "OK" @app.route('/jobs') def get_jobs(): job_info = {"count": len(scheduler.get_jobs())} for job in scheduler.get_jobs(): d = { "pending": job.pending, "id": job.id, "next_run_time": str(job.next_run_time)
class TestScheduler(TestCase): def setUp(self): self.app = Flask(__name__) self.scheduler = APScheduler() self.scheduler_two = APScheduler(app=self.app) def test_running(self): self.assertFalse(self.scheduler.running) self.scheduler.start() self.assertTrue(self.scheduler.running) def test_start_with_allowed_hosts(self): self.app.config['SCHEDULER_ALLOWED_HOSTS'] = ['any_server_name'] self.scheduler.init_app(self.app) self.scheduler.start() self.assertFalse(self.scheduler.running) def test_start_without_allowed_hosts(self): self.app.config['SCHEDULER_ALLOWED_HOSTS'] = [] self.scheduler.init_app(self.app) self.scheduler.start() self.assertFalse(self.scheduler.running) def test_shutdown(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_load_jobs_from_config(self): self.app.config['JOBS'] = [{ 'id': 'job1', 'func': 'tests.test_api:job1', 'trigger': 'interval', 'seconds': 10, }] self.app.config['SCHEDULER_JOBSTORES'] = { "default": apscheduler.jobstores.memory.MemoryJobStore() } self.app.config['SCHEDULER_EXECUTORS'] = { "default": { "type": "threadpool" } } self.app.config['SCHEDULER_JOB_DEFAULTS'] = {"coalesce": True} self.app.config['SCHEDULER_TIMEZONE'] = utc self.scheduler.init_app(app=self.app) job = self.scheduler.get_job('job1') self.assertIsNotNone(job) def test_task_decorator(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass job = self.scheduler.get_job('job1') self.assertIsNotNone(job) def test_state_prop(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.state) self.scheduler.shutdown() self.assertFalse(self.scheduler.state) def test_scheduler_prop(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertIsNotNone(self.scheduler.scheduler) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_pause_resume(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.pause() self.assertTrue(self.scheduler.state == 2) self.scheduler.resume() self.assertTrue(self.scheduler.state == 1) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_listener(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.add_listener(None) self.scheduler.remove_listener(None) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_remove_job(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.scheduler.remove_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_delete_job(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.scheduler.delete_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_remove_all_jobs(self): @self.scheduler.task('interval', hours=1, id='job1') def decorated_job(): pass @self.scheduler.task('interval', hours=1, id='job2') def decorated_job2(): pass self.scheduler.init_app(self.app) self.scheduler.start() jobs = self.scheduler.get_jobs() self.assertTrue(len(jobs) == 2) self.scheduler.remove_all_jobs() self.assertFalse(self.scheduler.get_job('job1')) self.assertFalse(self.scheduler.get_job('job2')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_delete_all_jobs(self): @self.scheduler.task('interval', hours=1, id='job1') def decorated_job(): pass @self.scheduler.task('interval', hours=1, id='job2') def decorated_job2(): pass self.scheduler.init_app(self.app) self.scheduler.start() jobs = self.scheduler.get_jobs() self.assertTrue(len(jobs) == 2) self.scheduler.delete_all_jobs() self.assertFalse(self.scheduler.get_job('job1')) self.assertFalse(self.scheduler.get_job('job2')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_job_to_dict(self): @self.scheduler.task('interval', hours=1, id='job1', end_date=datetime.datetime.now(), weeks=1, days=1, seconds=99) def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.assertTrue(len(utils.job_to_dict(job))) self.scheduler.delete_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running)
"left": 1220, "top": 20, "position": "absolute", "font-size": 20, 'backgroundColor': 'rgb(51, 151, 231,0.2)', 'fontWeight': '410', "text-align": "center", "border-radius": "5px" }), html.Div(children=["周期持仓表", table1], style={ 'width': 1700, 'height': 550, "left": 60, "top": 700, "position": "absolute", "font-size": 20, 'backgroundColor': 'rgb(151, 151, 231,0.2)', 'fontWeight': '410', "text-align": "center", "border-radius": "5px" }) ] if __name__ == '__main__': print(scheduler.get_jobs()) server.run(host='127.0.0.1', port=8888, debug=True)
def get_app(): import atexit import os import yaml from flask import Flask from flask_apscheduler import APScheduler from apscheduler.jobstores.redis import RedisJobStore from apscheduler.jobstores.memory import MemoryJobStore from tracker_client_plugins import tracker_clients import docker_worker_pool from docker_worker_pool import get_cron_workers, DockerWorker global _app if _app is not None: return _app _app = Flask(__name__) # load tracker plugins try: with open('tracker_client_plugins.yaml', 'r') as f: tracker_dict = yaml.load(f, Loader=yaml.FullLoader) for plugin_name, kwargs in tracker_dict.items(): tracker_clients.add(plugin_name, **kwargs) except FileNotFoundError: pass job_stores = { 'redis': RedisJobStore(host=tracker_dict['redis_tracker_client']['host'], port=tracker_dict['redis_tracker_client']['port']), 'default': MemoryJobStore() } _app.config['SCHEDULER_JOBSTORES'] = job_stores scheduler = APScheduler() # it is also possible to enable the API directly # scheduler.api_enabled = True scheduler.init_app(_app) atexit.register(lambda: scheduler.shutdown(wait=False)) num_workers = int(os.environ.get("NUM_WORKERS", 1)) for i in range(num_workers): docker_worker_pool.add() scheduler.start() loaded_scheduled_jobs = scheduler.get_jobs(jobstore='redis') _cron_workers = get_cron_workers() if loaded_scheduled_jobs: for cron_job in loaded_scheduled_jobs: cron_worker_index = docker_worker_pool.get_cron_worker_index( cron_job.id) _cron_workers[cron_worker_index] = DockerWorker( cron_job.id, cron_job) return _app