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
92 lines
2.8 KiB
Python
Executable File
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)
|