Files
tryton/trytond/trytond/cron.py
T
2024-04-03 16:28:22 +02:00

67 lines
2.0 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime as dt
import logging
import signal
import sys
import time
from concurrent import futures
from multiprocessing import cpu_count
from trytond.pool import Pool
from trytond.transaction import Transaction
__all__ = ['run']
logger = logging.getLogger(__name__)
def run(options):
try:
processes = options.processes or cpu_count()
except NotImplementedError:
processes = 1
logger.info("start %d crons", processes)
executor_options = dict(
max_workers=processes,
mp_context=None,
initializer=initializer,
initargs=(options.database_names,),
max_tasks_per_child=options.maxtasksperchild,
)
if sys.version_info < (3, 11):
del executor_options["max_tasks_per_child"]
with futures.ProcessPoolExecutor(**executor_options) as executor:
while True:
for database_name in options.database_names:
executor.submit(run_cron, database_name)
if options.once:
break
else:
now = dt.datetime.now()
time.sleep(60 - (now.second + now.microsecond / 10**6))
def initializer(database_names, worker=True):
if worker:
signal.signal(signal.SIGINT, signal.SIG_IGN)
pools = []
database_list = Pool.database_list()
for database_name in database_names:
pool = Pool(database_name)
if database_name not in database_list:
with Transaction().start(database_name, 0, readonly=True):
pool.init()
pools.append(pool)
return pools
def run_cron(database_name):
database_list = Pool.database_list()
pool = Pool(database_name)
if database_name not in database_list:
with Transaction().start(database_name, 0, readonly=True):
pool.init()
Cron = pool.get('ir.cron')
Cron.run(database_name)