Skip to content

Instantly share code, notes, and snippets.

@xiazhibin
Last active March 17, 2018 08:31
Show Gist options
  • Save xiazhibin/c6dfe73135980c71c950fe42a052344d to your computer and use it in GitHub Desktop.
Save xiazhibin/c6dfe73135980c71c950fe42a052344d to your computer and use it in GitHub Desktop.
定时任务执行
import bisect
import heapq
import time
from collections import namedtuple
timeouts = namedtuple('Timeouts', ['deadline', 'task'])
class Task(object):
def __init__(self, schedule, name):
self.name = name
self.schedule = schedule
self.deadline = None
def __call__(self, *args, **kwargs):
print 'task:{0}'.format(self.name)
def __repr__(self):
return '<Task {0}>'.format(self.name)
class Runner(object):
def __init__(self):
self._timeouts = []
def run(self):
while True:
now = time.time()
for task in self._timeouts:
if task.deadline < now:
self._run_callback(task)
time.sleep(1)
def _run_callback(self, task):
task.deadline = time.time() + task.schedule
task()
def add_task(self, task):
task.deadline = task.schedule + time.time()
self._timeouts.append(task)
runner = Runner()
runner.add_task(Task(1, 'jack'))
runner.add_task(Task(1, 'rose'))
runner.add_task(Task(2, 'bin'))
runner.add_task(Task(3, 'moke'))
runner.run()
import bisect
import heapq
import time
from collections import namedtuple
timeouts = namedtuple('Timeouts', ['deadline', 'task'])
class Task(object):
def __init__(self, schedule, name):
self.name = name
self.schedule = schedule
self.deadline = None
def __call__(self, *args, **kwargs):
print 'task:{0}'.format(self.name)
def __repr__(self):
return '<Task {0}>'.format(self.name)
class Runner(object):
def __init__(self):
self._timeouts = []
def run(self):
while True:
min_time = 1
now = time.time()
for task in self._timeouts:
remain_time = task.deadline - now
if remain_time > 0:
min_time = min(min_time, remain_time)
else:
self._run_callback(task)
time.sleep(min_time)
def _run_callback(self, task):
task.deadline = time.time() + task.schedule
task() # what to do if it run amount time
def add_task(self, task):
task.deadline = task.schedule + time.time()
self._timeouts.append(task)
runner = Runner()
runner.add_task(Task(1, 'jack'))
runner.add_task(Task(1, 'rose'))
runner.add_task(Task(2, 'bin'))
runner.add_task(Task(3, 'moke'))
runner.run()
import bisect
import heapq
import time
from collections import namedtuple
timeouts = namedtuple('Timeouts', ['deadline', 'task'])
class Task(object):
def __init__(self, schedule, name):
self.name = name
self.schedule = schedule
self.deadline = None
def __call__(self, *args, **kwargs):
print 'task:{0}'.format(self.name)
def __repr__(self):
return '<Task {0}>'.format(self.name)
class Runner(object):
def __init__(self):
self._timeouts = []
def add_timeout(self, task):
task.deadline = time.time() + task.schedule
heapq.heappush(self._timeouts, timeouts(deadline=task.deadline, task=task))
def run(self):
while True:
min_time = 0.2
due_to_call = []
if self._timeouts:
now = time.time()
while self._timeouts:
if self._timeouts[0].deadline <= now:
due_to_call.append(heapq.heappop(self._timeouts))
else:
break
for timeouts in due_to_call:
self._run_callback(timeouts.task)
self.add_timeout(timeouts.task)
due_timeouts = None
if self._timeouts:
milliseconds = self._timeouts[0].deadline - now
min_time = min(milliseconds, min_time)
time.sleep(min_time)
def _run_callback(self, task):
task()
runner = Runner()
runner.add_timeout(Task(1, 'jack'))
runner.add_timeout(Task(1, 'rose'))
runner.add_timeout(Task(2, 'bin'))
runner.add_timeout(Task(3, 'moke'))
runner.run()
import bisect
import time
class Task(object):
def __init__(self, schedule, name):
self.name = name
self.schedule = schedule
self.deadline = None
def __call__(self, *args, **kwargs):
print 'task:{0}'.format(self.name)
def __cmp__(self, other):
return cmp((self.deadline, id(self)),
(other.deadline, id(other)))
def __repr__(self):
return '<Task {0}>'.format(self.name)
class Runner(object):
def __init__(self):
self._timeouts = []
def add_timeout(self, task):
task.deadline = time.time() + task.schedule
bisect.insort(self._timeouts, task)
def run(self):
while True:
min_time = 0.2
if self._timeouts:
now = time.time()
while self._timeouts and self._timeouts[0].deadline <= now:
task = self._timeouts.pop(0)
self._run_callback(task)
self.add_timeout(task)
if self._timeouts:
milliseconds = self._timeouts[0].deadline - now
min_time = min(milliseconds, min_time)
time.sleep(min_time)
def _run_callback(self, task):
task()
runner = Runner()
runner.add_timeout(Task(1, 'jack'))
runner.add_timeout(Task(1, 'rose'))
runner.add_timeout(Task(2, 'bin'))
runner.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment