python - Bagaimana untuk menambah tugas secara dinamik semasa menjalankan penjadual pukulan saderi?
某草草
某草草 2017-05-18 10:56:10
0
2
2173

Saya mencuba django-celery-beat Menambah tugasan di latar belakang pentadbir boleh mencapai penambahan tugasan yang dinamik
Tetapi ia akan berkuat kuasa hanya selepas memulakan semula celery beat.

某草草
某草草

membalas semua(2)
为情所困

Tidak boleh ditambah secara dinamik, rentak mesti dimulakan semula.

tanya jawab sebab #3493

小葫芦

Ada idea yang boleh anda pertimbangkan Saya sedang mencuba kaedah ini dan sedang dalam peringkat cuba menyeberangi sungai dengan merasai batu. Saderi menyokong tugas berjadual, tetapi ia tidak memenuhi keperluan saya. Saya perlu menambah tugas berjadual secara dinamik seperti crontab di bawah Linux. Saya juga melihat django-celery-beat , jadi saya telah Selepas membaca dokumentasi dan mencari maklumat, saya akhirnya menemui cara Fungsi apply_async adalah sangat berguna Ia mempunyai parameter eta yang dipermudahkan ialah undur, tetapi kuasa eta adalah besar kerana ia hanya menerima datetime objects , sebagai contoh, jika anda memberikan tugasan untuk dilaksanakan pada 2017-05-02 20:0:0, anda boleh menggunakannya seperti ini:

job.apply_async(args=args, kwarg=kwargs, eta=datetime(2017,5,2,20,0,0))

Adakah ia jarang digunakan? Jika saya mempunyai tugas yang perlu dilaksanakan pada pukul lapan setiap malam, saya boleh menggunakan parameter eta untuk mencapainya. Kod pseudo adalah seperti berikut:

时间规则 = '每天晚上八点执行'
第一次调用任务,先计算最近的执行时间,作为eta的参数,调用apply_async函数,
然后第一次任务执行成功,得到上次任务的eta参数值,在天的值上加一,然后把新的执行时间作为eta的参数再次调用apply_async函数,这里省略了很多判断,自行脑补。
循环往复,是不是一直按每天晚上八点执行。

Satu perkara yang sangat penting di sini ialah cara mengira masa pelaksanaan seterusnya apabila tugasan berjaya dilaksanakan Caranya adalah seperti berikut

class MyTask(Task):
    def on_success(self, retval, task_id, args, kwargs):
        print 'task done: {0}'.format(retval)
        return super(MyTask, self).on_success(retval, task_id, args, kwargs)
        
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print 'task fail, reason: {0}'.format(exc)
        return super(MyTask, self).on_failure(exc, task_id, args, kwargs, einfo)
        
@app.task(base=MyTask)
def add(x, y):
    return x + y

Ia menyediakan fungsi untuk kejayaan dan kegagalan pelaksanaan tugas Kami hanya perlu menulis semula atas dasar ini Saya hanya bercakap tentang bahagian teras Terdapat banyak cara untuk melakukannya secara khusus

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan