From fcd0a01de34d35d06a8da077dc652d9ae86c5949 Mon Sep 17 00:00:00 2001 From: Martin Zimmermann Date: Mon, 16 Dec 2013 15:40:16 +0100 Subject: [PATCH] make_app uses threading.Lock now by default Uses keyword arguments to use multiprocessing or uwsgi mixin. This fixes an issue on exotic *BSDs such as NetBSD where Python comes not with inter-process semaphores (issue 3307): mod_wsgi (pid=14365): Target WSGI script '/var/www/vhosts/my.hostname.org/htdocs/isso.wsgi' cannot be loaded as Python module. mod_wsgi (pid=14365): Exception occurred processing WSGI script '/var/www/vhosts/my.hostname.org/htdocs/isso.wsgi'. Traceback (most recent call last): File "/var/www/vhosts/my.hostname.org/htdocs/isso.wsgi", line 8, in application = make_app(Config.load("/var/www/vhosts/my.hostname.org/htdocs/isso.cfg")) File "/usr/pkg/lib/python2.7/site-packages/isso/__init__.py", line 155, in make_app isso = App(conf) File "/usr/pkg/lib/python2.7/site-packages/isso/__init__.py", line 91, in __init__ super(Isso, self).__init__(conf) File "/usr/pkg/lib/python2.7/site-packages/isso/core.py", line 223, in __init__ self.lock = multiprocessing.Lock() File "/usr/pkg/lib/python2.7/multiprocessing/__init__.py", line 175, in Lock from multiprocessing.synchronize import Lock File "/usr/pkg/lib/python2.7/multiprocessing/synchronize.py", line 59, in " function, see issue 3770.") ImportError: This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770. --- isso/__init__.py | 25 +++++++++++++------------ isso/run.py | 3 ++- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/isso/__init__.py b/isso/__init__.py index d668f3e..6346e36 100644 --- a/isso/__init__.py +++ b/isso/__init__.py @@ -30,16 +30,15 @@ from __future__ import print_function import pkg_resources dist = pkg_resources.get_distribution("isso") -try: - import uwsgi -except ImportError: - uwsgi = None +# check if exectuable is `isso` and gevent is available +import sys + +if sys.argv[0].startswith("isso"): try: import gevent.monkey; gevent.monkey.patch_all() except ImportError: - gevent = None + pass -import sys import os import errno import logging @@ -140,18 +139,20 @@ class Isso(object): return self.wsgi_app(environ, start_response) -def make_app(conf=None): +def make_app(conf=None, threading=True, multiprocessing=False, uwsgi=False): - if uwsgi: - class App(Isso, uWSGIMixin): - pass - elif gevent or sys.argv[0].endswith("isso"): + if threading: class App(Isso, ThreadedMixin): pass - else: + + if multiprocessing: class App(Isso, ProcessMixin): pass + if uwsgi: + class App(Isso, uWSGIMixin): + pass + isso = App(conf) for host in conf.getiter("general", "host"): diff --git a/isso/run.py b/isso/run.py index 0a156e9..94bdc04 100644 --- a/isso/run.py +++ b/isso/run.py @@ -5,4 +5,5 @@ import os from isso import make_app from isso.core import Config -application = make_app(Config.load(os.environ.get('ISSO_SETTINGS'))) +application = make_app(Config.load(os.environ.get('ISSO_SETTINGS')), + multiprocessing=True)