Skip to content

Commit f8dbda3

Browse files
authored
Merge pull request #57 from Techainer/gevent
Handle gevent monkey patch and update pipeline
2 parents a52cf88 + f46da7b commit f8dbda3

File tree

18 files changed

+284
-760
lines changed

18 files changed

+284
-760
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
fail-fast: false
1717
matrix:
1818
os: [macos-latest, ubuntu-latest, windows-latest]
19-
python-version: [3.7, 3.8, 3.9]
19+
python-version: ["3.9"]
2020

2121
if: "!contains(github.event.head_commit.message, 'ci skip')"
2222

mlchain/__init__.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
from os import environ
2+
3+
if "DISABLE_GEVENT_FIX" not in environ:
4+
# Fix gevent
5+
try:
6+
from gevent import monkey
7+
monkey.patch_all(thread=False, socket=False)
8+
except ImportError:
9+
pass
10+
11+
import ssl
12+
try:
13+
_create_unverified_https_context = ssl._create_unverified_context
14+
except AttributeError:
15+
# Legacy Python that doesn't verify HTTPS certificates by default
16+
pass
17+
else:
18+
# Handle target environment that doesn't support HTTPS verification
19+
ssl._create_default_https_context = _create_unverified_https_context
20+
121
# Mlchain Context
222
from contextvars import ContextVar
323
from typing import Any, Dict
@@ -7,26 +27,17 @@
727
)
828

929
# Parameters of MLchain
10-
__version__ = "0.3.0"
30+
__version__ = "0.3.1"
1131

1232
HOST = "https://www.api.mlchain.ml"
1333
WEB_HOST = HOST
1434
API_ADDRESS = HOST
1535
MODEL_ID = None
16-
import ssl
17-
18-
try:
19-
_create_unverified_https_context = ssl._create_unverified_context
20-
except AttributeError:
21-
# Legacy Python that doesn't verify HTTPS certificates by default
22-
pass
23-
else:
24-
# Handle target environment that doesn't support HTTPS verification
25-
ssl._create_default_https_context = _create_unverified_https_context
2636

2737
from os import environ
2838

2939
environ['OBJC_DISABLE_INITIALIZE_FORK_SAFETY'] = 'YES'
40+
3041
from mlchain.base.log import logger
3142
from .context import mlchain_context
3243

mlchain/cli/mlconfig.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ gunicorn:
2626
threads: 1 # Number of simultaneous threads in workers
2727
worker_class: gthread # The base worker_class, can use gevent (For better IO) or uvicorn.workers.UvicornWorker (starlette - For Async)
2828
max_requests_jitter: 50 # Restart worker different time
29-
accesslog: mlchain-server.log # Log file for gunicorn
3029

3130
bind:
3231
- 'unix:/tmp/gunicorn.sock' # Using sock to make gunicorn faster

mlchain/config.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ def load_config(self, path, mode=None):
102102
for k, v in data['mode']['env'][mode].items():
103103
if k in environ:
104104
data['mode']['env'][mode][k] = environ[k]
105+
if isinstance(v, dict):
106+
for sub_k, sub_v in v.items():
107+
env_key = f"{k}___{sub_k}"
108+
if env_key in environ:
109+
data['mode']['env'][mode][k][sub_k] = environ[env_key]
105110
self.update(data['mode']['env'][mode])
106111

107112
def get_client_config(self, name):
@@ -152,6 +157,11 @@ def load_config(data):
152157
for k, v in data['mode']['env'][mode].items():
153158
if k in environ:
154159
data['mode']['env'][mode][k] = environ[k]
160+
if isinstance(v, dict):
161+
for sub_k, sub_v in v.items():
162+
env_key = f"{k}___{sub_k}"
163+
if env_key in environ:
164+
data['mode']['env'][mode][k][sub_k] = environ[env_key]
155165
mlconfig.update(data['mode']['env'][mode])
156166

157167
if (mlconfig.MLCHAIN_SENTRY_DSN is not None and mlconfig.MLCHAIN_SENTRY_DSN != 'None') and data.get('wrapper', None) != 'gunicorn':

mlchain/server/base.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ def __init__(self, model: ServeModel, name=None, version=None, api_format=None,
8585
self.converter = Converter()
8686

8787
self.initialize_app()
88+
self._swaggered = False
8889

8990
def _check_status(self):
9091
"""
@@ -113,7 +114,9 @@ def register_swagger(self):
113114
"""
114115
Add Swagger to URL
115116
"""
116-
return self._register_swagger()
117+
if not self._swaggered:
118+
self._register_swagger()
119+
self._swaggered = True
117120

118121
def add_endpoint(self, endpoint=None, endpoint_name=None,
119122
handler=None, methods=['GET', 'POST']):
@@ -178,7 +181,7 @@ def initialize_endpoint(self):
178181
self._register_home()
179182

180183
try:
181-
self._register_swagger()
184+
self.register_swagger()
182185
except Exception as ex:
183186
logger.error("Can't register swagger with error {0}".format(ex))
184187

mlchain/workflows/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
1-
from .background import Background
2-
from .parallel import Parallel
3-
from .task import Task, SyncTask
4-
from .pipeline import Step, Pipeline
5-
from .limiter import RateLimiter, AsyncRateLimiter
1+
from mlchain.workflows_sync import Task as SyncTask
2+
from mlchain.workflows_sync import Background, Parallel, Task, RateLimiter, AsyncRateLimiter

mlchain/workflows/background.py

Lines changed: 0 additions & 130 deletions
This file was deleted.

0 commit comments

Comments
 (0)