Files
tryton/trytond/bin/trytond
T
Cédric Krier ec5a00c82e Make pool initialization atomic
An instance of pool is created per thread and it stores a reference to the
current pool values.
When the pool is initialized, a temporary reference is set on the instance so
only the values for this thread is modified. Once the initialization is
complete, the new pool value replace the global values.
Each instances is refreshed with the global values after the pool has been
stopped.

Closes #11401
2024-03-06 18:28:38 +01:00

92 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
# PYTHON_ARGCOMPLETE_OK
# 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 glob
import logging
import os
import sys
import threading
try:
import argcomplete
except ImportError:
argcomplete = None
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
'..', '..', 'trytond')))
if os.path.isdir(DIR):
sys.path.insert(0, os.path.dirname(DIR))
import trytond.commandline as commandline
from trytond.config import config, split_netloc
parser = commandline.get_parser_daemon()
if argcomplete:
argcomplete.autocomplete(parser)
options = parser.parse_args()
commandline.config_log(options)
extra_files = config.update_etc(options.configfile)
if options.coroutine:
# Monkey patching must be done before importing
from gevent import monkey
monkey.patch_all()
from trytond.modules import get_module_info, get_modules
from trytond.pool import Pool
# Import trytond things after it is configured
from trytond.wsgi import app
with commandline.pidfile(options):
Pool.start()
threads = []
for name in options.database_names:
thread = threading.Thread(target=lambda: Pool(name).init())
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
hostname, port = split_netloc(config.get('web', 'listen'))
certificate = config.get('ssl', 'certificate')
try:
if config.getboolean('ssl', 'certificate'):
certificate = None
except ValueError:
pass
privatekey = config.get('ssl', 'privatekey')
try:
if config.getboolean('ssl', 'privatekey'):
privatekey = None
except ValueError:
pass
if certificate or privatekey:
from werkzeug.serving import load_ssl_context
ssl_args = dict(
ssl_context=load_ssl_context(certificate, privatekey))
else:
ssl_args = {}
if options.dev and not options.coroutine:
for module in get_modules():
info = get_module_info(module)
for ext in ['xml',
'fodt', 'odt', 'fodp', 'odp', 'fods', 'ods', 'fodg', 'odg',
'txt', 'html', 'xhtml']:
path = os.path.join(info['directory'], '**', '*.' + ext)
extra_files.extend(glob.glob(path, recursive=True))
if options.coroutine:
from gevent.pywsgi import WSGIServer
logger = logging.getLogger('gevent')
WSGIServer((hostname, port), app,
log=logger,
error_log=logger,
**ssl_args).serve_forever()
else:
from werkzeug.serving import run_simple
run_simple(hostname, port, app,
threaded=True,
extra_files=extra_files,
use_reloader=options.dev,
**ssl_args)