-
Notifications
You must be signed in to change notification settings - Fork 107
/
Copy pathmain.py
122 lines (96 loc) · 4.58 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
"""Main entrypoint."""
import argparse
def parse_args():
parser = argparse.ArgumentParser(
description='Python Azure Functions Worker')
parser.add_argument('--host',
help="host address")
parser.add_argument('--port', type=int,
help='port number')
parser.add_argument('--workerId', dest='worker_id',
help='id for the worker')
parser.add_argument('--requestId', dest='request_id',
help='id of the request')
parser.add_argument('--log-level', type=str, default='INFO',
choices=['TRACE', 'INFO', 'WARNING', 'ERROR'],
help="log level: 'TRACE', 'INFO', 'WARNING', "
"or 'ERROR'")
parser.add_argument('--log-to', type=str, default=None,
help='log destination: stdout, stderr, '
'syslog, or a file path')
parser.add_argument('--grpcMaxMessageLength', type=int,
dest='grpc_max_msg_len')
parser.add_argument('--functions-uri', dest='functions_uri', type=str,
help='URI with IP Address and Port used to'
' connect to the Host via gRPC.')
parser.add_argument('--functions-request-id', dest='functions_request_id',
type=str, help='Request ID used for gRPC communication '
'with the Host.')
parser.add_argument('--functions-worker-id',
dest='functions_worker_id', type=str,
help='Worker ID assigned to this language worker.')
parser.add_argument('--functions-grpc-max-message-length', type=int,
dest='functions_grpc_max_msg_len',
help='Max grpc message length for Functions')
return parser.parse_args()
def main():
from .utils.dependency import DependencyManager
DependencyManager.initialize()
DependencyManager.use_worker_dependencies()
import asyncio
from . import logging
from .logging import error_logger, format_exception, logger
args = parse_args()
logging.setup(log_level=args.log_level, log_destination=args.log_to)
# register sigterm handler
register_sigterm_handler()
logger.info('Starting Azure Functions Python Worker.')
logger.info('Worker ID: %s, Request ID: %s, Host Address: %s:%s',
args.worker_id, args.request_id, args.host, args.port)
try:
return asyncio.run(start_async(
args.host, args.port, args.worker_id, args.request_id))
except Exception as ex:
error_logger.exception(
'unhandled error in functions worker: {0}'.format(
format_exception(ex)))
raise
def register_sigterm_handler():
import signal
"""
Registers a custom handler for the SIGTERM signal.
This function will set up a signal handler to intercept the SIGTERM signal,
which is typically sent to gracefully terminate a process. When SIGTERM is
received, the program will log the signal and perform a graceful shutdown
by calling sys.exit().
Windows Python Function is not supported and Windows does not support
SIGTERM.
"""
def handle_sigterm(signum, frame):
from . import dispatcher
import sys
from .logging import logger, flush_logger
import traceback
from azure_functions_worker.dispatcher import DispatcherMeta
from azure_functions_worker import loader
# Log the received signal
logger.info(f"SIGTERM received (signal: {signum}). "
"Shutting down gracefully...")
# Log the frame details to see whats executed when the signal was received
logger.info("Frame details at signal receipt:"
f"\n{''.join(traceback.format_stack(frame))}")
DispatcherMeta.__current_dispatcher__ = None
loader.uninstall()
flush_logger(logger)
dispatcher.Dispatcher.stop()
sys.exit(0) # Exit the program gracefully
signal.signal(signal.SIGTERM, handle_sigterm)
async def start_async(host, port, worker_id, request_id):
from . import dispatcher
disp = await dispatcher.Dispatcher.connect(host=host, port=port,
worker_id=worker_id,
request_id=request_id,
connect_timeout=5.0)
await disp.dispatch_forever()