Skip to content

Commit 6256388

Browse files
committed
Load function in child process.
1 parent 7868e46 commit 6256388

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed

lambda_local/main.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,32 @@ def filter(self, record):
3838
return True
3939

4040

41+
class FunctionLoader():
42+
def __init__(self,
43+
request_id=None,
44+
source=None,
45+
function_name=None,
46+
library_path=None,
47+
func=None):
48+
self.request_id = request_id
49+
self.source = source
50+
self.function_name = function_name
51+
self.library_path = library_path
52+
53+
self.func = func
54+
55+
def load(self):
56+
if self.library_path is not None:
57+
load_lib(self.library_path)
58+
59+
self.func = load_source(
60+
self.request_id, self.source, self.function_name)
61+
62+
4163
def call(func, event, context, environment_variables={}):
4264
export_variables(environment_variables)
43-
44-
return _runner(func, event, context)
65+
loader = FunctionLoader(func=func)
66+
return _runner(loader, event, context)
4567

4668

4769
def run(args):
@@ -53,17 +75,19 @@ def run(args):
5375
args.timeout,
5476
invoked_function_arn=args.arn_string,
5577
function_version=args.version_name)
56-
if args.library is not None:
57-
load_lib(args.library)
58-
func = load(c.aws_request_id, args.file, args.function)
78+
loader = FunctionLoader(
79+
request_id=c.aws_request_id,
80+
source=args.file,
81+
function_name=args.function,
82+
library_path=args.library)
5983

60-
(result, err_type) = _runner(func, e, c)
84+
(result, err_type) = _runner(loader, e, c)
6185

6286
if err_type is not None:
6387
sys.exit(EXITCODE_ERR)
6488

6589

66-
def _runner(func, event, context):
90+
def _runner(loader, event, context):
6791
logger = logging.getLogger()
6892

6993
logger.info("Event: {}".format(event))
@@ -73,7 +97,7 @@ def _runner(func, event, context):
7397
queue = multiprocessing.Queue()
7498
p = multiprocessing.Process(
7599
target=execute_in_process,
76-
args=(queue, func, event, context,))
100+
args=(queue, loader, event, context,))
77101
p.start()
78102
(result, err_type, duration) = queue.get()
79103
p.join()
@@ -94,7 +118,7 @@ def load_lib(path):
94118
sys.path.append(os.path.abspath(path))
95119

96120

97-
def load(request_id, path, function_name):
121+
def load_source(request_id, path, function_name):
98122
mod_name = 'request-' + str(request_id)
99123

100124
file_path = os.path.abspath(path)
@@ -142,9 +166,11 @@ def execute(func, event, context):
142166
return result, err_type
143167

144168

145-
def execute_in_process(queue, func, event, context):
169+
def execute_in_process(queue, loader, event, context):
170+
if loader.func is None:
171+
loader.load()
146172
start_time = timeit.default_timer()
147-
result, err_type = execute(func, event, context)
173+
result, err_type = execute(loader.func, event, context)
148174
end_time = timeit.default_timer()
149175
duration = (end_time - start_time) * 1000
150176

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy