Scheduled action (ir.cron) jalan di worker background. Cron yang jelek menahan lock database dan memblokir user.
Definisikan
<record id="cron_sync_prices" model="ir.cron">
<field name="name">Sync prices</field>
<field name="model_id" ref="product.model_product_template"/>
<field name="state">code</field>
<field name="code">model._cron_sync_prices()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
</record>
Kerjakan per batch
@api.model
def _cron_sync_prices(self, batch=200):
todo = self.search([('price_dirty', '=', True)], limit=batch)
for rec in todo:
rec._sync_price()
if len(todo) == batch:
self.env.ref('mymodule.cron_sync_prices')._trigger()
self.env['ir.cron']._commit_progress(len(todo)) # Odoo 18+
_trigger() menjadwalkan run berikutnya segera, jadi satu run tidak menahan transaksi raksasa.
Aturan
- Buat idempotent. Jalan dua kali tidak boleh menghitung ganda.
- Jangan loop semua record tanpa
limit. - Catat jumlah record yang diproses.
- Tes dari Settings → Technical → Scheduled Actions → Run Manually.