8
8
import traceback
9
9
import json
10
10
import logging
11
- import uuid
12
11
import os
13
12
import timeit
14
13
from botocore .vendored .requests .packages import urllib3
14
+ import multiprocessing
15
15
16
16
from . import event
17
17
from . import context
@@ -68,28 +68,28 @@ def run(args):
68
68
69
69
def _runner (func , event , context ):
70
70
logger = logging .getLogger ()
71
- log_filter = ContextFilter (context )
72
- logger .addFilter (log_filter )
73
-
74
- result = None
75
71
76
72
logger .info ("Event: {}" .format (event ))
77
- logger .info ("START RequestId: {}" .format (context .aws_request_id ))
73
+ logger .info ("START RequestId: {} Version: {}" .format (
74
+ context .aws_request_id , context .function_version ))
78
75
79
- start_time = timeit .default_timer ()
80
- result , err_type = execute (func , event , context )
81
- end_time = timeit .default_timer ()
76
+ queue = multiprocessing .Queue ()
77
+ p = multiprocessing .Process (
78
+ target = execute_in_process ,
79
+ args = (queue , func , event , context ,))
80
+ p .start ()
81
+ (result , err_type , duration ) = queue .get ()
82
+ p .join ()
82
83
83
84
logger .info ("END RequestId: {}" .format (context .aws_request_id ))
85
+ duration = "{0:.2f} ms" .format (duration )
86
+ logger .info ("REPORT RequestId: {}\t Duration: {}" .format (
87
+ context .aws_request_id , duration ))
84
88
if type (result ) is TimeoutException :
85
89
logger .error ("RESULT:\n {}" .format (result ))
86
90
else :
87
91
logger .info ("RESULT:\n {}" .format (result ))
88
92
89
- duration = "{0:.2f} ms" .format ((end_time - start_time ) * 1000 )
90
- logger .info ("REPORT RequestId: {}\t Duration: {}" .format (
91
- context .aws_request_id , duration ))
92
-
93
93
return (result , err_type )
94
94
95
95
@@ -112,9 +112,13 @@ def load(request_id, path, function_name):
112
112
def execute (func , event , context ):
113
113
err_type = None
114
114
115
+ logger = logging .getLogger ()
116
+ log_filter = ContextFilter (context )
117
+ logger .addFilter (log_filter )
118
+
115
119
try :
116
120
with time_limit (context ._timeout_in_seconds ):
117
- result = func (event , context .activate ())
121
+ result = func (event , context ._activate ())
118
122
except TimeoutException as err :
119
123
result = err
120
124
err_type = ERR_TYPE_TIMEOUT
@@ -128,3 +132,12 @@ def execute(func, event, context):
128
132
err_type = ERR_TYPE_EXCEPTION
129
133
130
134
return result , err_type
135
+
136
+
137
+ def execute_in_process (queue , func , event , context ):
138
+ start_time = timeit .default_timer ()
139
+ result , err_type = execute (func , event , context )
140
+ end_time = timeit .default_timer ()
141
+ duration = (end_time - start_time ) * 1000
142
+
143
+ queue .put ((result , err_type , duration ))
0 commit comments