I like it too. Perhaps throw in a start of schedule interval Schedule object in 
the package too. 

James Coder

> On May 10, 2020, at 4:24 PM, Kaxil Naik <kaxiln...@gmail.com> wrote:
> 
> I like that idea Daniel of having a Schedule abstraction.
> 
>> On Wed, May 6, 2020 at 7:22 PM Daniel Standish <dpstand...@gmail.com> wrote:
>> 
>> Inspired by James, I tried this out...
>> 
>> For others interested, here is sample dag to test it out:
>> 
>> class MyDAG(DAG):
>>    def following_schedule(self, dttm):
>>        pen_dt = pendulum.instance(dttm).replace(second=0, microsecond=0)
>>        minutes = pen_dt.minute
>>        minutes_mod = minutes % 10
>>        if minutes_mod < 5:
>>            return pen_dt.add(minutes=1)
>>        else:
>>            return pen_dt.add(minutes=10 - minutes_mod)
>> 
>>    def previous_schedule(self, dttm):
>>        pen_dt = pendulum.instance(dttm).replace(second=0, microsecond=0)
>>        minutes = pen_dt.minute
>>        minutes_mod = minutes % 10
>>        if minutes_mod < 5:
>>            return pen_dt.add(minutes=-1)
>>        else:
>>            return pen_dt.add(minutes=-(minutes_mod - 5))
>> 
>> 
>> dag = MyDAG(
>>    dag_id='test_schd',
>>    default_args=default_args,
>>    schedule_interval='@daily',
>>    catchup=True,
>>    concurrency=1000,
>>    max_active_runs=10,
>> )
>> 
>> 
>> with dag:
>>    DummyOperator(task_id='test', task_concurrency=1000)
>> 
>> What this will do is trigger one run for every minute when minutes (mod 10)
>> is between 0-4 but not schedule anything between 5-9 *(or something like
>> that, i did not scrutinize the edges carefully)*.
>> 
>> But...  anyway, it'll prove that it works relatively quickly and that's the
>> point.
>> 
>> I have a use case.  I think i might use it, rather than adding branching
>> logic.  It's ugly, but they are both ugly.
>> 
>> *Question*
>> 
>> What do people think about a Schedule abstraction that takes the
>> previous_schedule and following_schedule methods from dag (perhaps rename
>> to previous_execution following_execution?)
>> 
>> Then I imagine we could do this:
>> * deprecate the `schedule_interval` param
>> * rename schedule_interval to ``schedule: Union[Schedule, str, timedelta]``
>> and preserve backward compatibility
>> * if str or timedelta is given, we instantiate a suitable Schedule object.
>> Perhaps there is a CronSchedule and a TimedeltaSchedule.
>> 
>> Any interest?
>> 
>> Ash, you had mentioned something about some plans that were in conflict
>> with the above hack.... could you maybe share a thought or two about what
>> you were thinking?
>> 
>> *Another idea*
>> 
>> If we could maybe leave it to the `Schedule` class to decide the
>> relationship between run time and "execution_date".  There is the "interval
>> edge PR"...  But maybe there would be an elegant way to control that
>> behavior in the Schedule class.  Perhaps simply a class constant, or param.
>> 

Reply via email to