2
2
import concurrent .futures
3
3
import importlib .util
4
4
import logging
5
- import os
6
5
import queue
7
6
import sys
8
7
import threading
13
12
from typing import Optional
14
13
15
14
import grpc
16
- import azure_functions_worker
17
15
18
16
from proxy_worker import protos
19
17
from proxy_worker .logging import (
30
28
from proxy_worker .version import VERSION
31
29
from .utils .dependency import DependencyManager
32
30
31
+ # Library worker import reloaded in init and reload request
32
+ library_worker = None
33
+
33
34
class ContextEnabledTask (asyncio .Task ):
34
35
AZURE_INVOCATION_ID = '__azure_function_invocation_id__'
35
36
@@ -103,6 +104,7 @@ def current(cls):
103
104
return disp
104
105
105
106
107
+
106
108
class Dispatcher (metaclass = DispatcherMeta ):
107
109
_GRPC_STOP_RESPONSE = object ()
108
110
@@ -376,42 +378,6 @@ def tp_max_workers_validator(value: str) -> bool:
376
378
# We can box the app setting as int for earlier python versions.
377
379
return int (max_workers ) if max_workers else None
378
380
379
- @staticmethod
380
- def reload_azure_functions_worker ():
381
- try :
382
- DependencyManager .reload_azure_google_namespace_from_worker_deps ()
383
-
384
- customer_packages_path = sys .path [0 ]
385
- potential_path = os .path .join (customer_packages_path , "azure_functions_worker" , "__init__.py" )
386
-
387
- if not os .path .exists (potential_path ):
388
- raise FileNotFoundError (f"ERROR: Expected module file not found at { potential_path } " )
389
-
390
- if "azure_functions_worker" in sys .modules :
391
- del sys .modules ["azure_functions_worker" ]
392
-
393
- # Create module spec with forced reloading
394
- spec = importlib .util .spec_from_file_location ("azure_functions_worker" , potential_path )
395
-
396
- if spec is None :
397
- raise ImportError (f"ERROR: Failed to create module spec for { potential_path } " )
398
-
399
- if spec .loader is None :
400
- raise ImportError (f"ERROR: spec.loader is None for { potential_path } " )
401
-
402
- # Load module manually
403
- module = importlib .util .module_from_spec (spec )
404
- spec .loader .exec_module (module )
405
-
406
- # Force all references to use the new module
407
- sys .modules ["azure_functions_worker" ] = module
408
- globals ()["azure_functions_worker" ] = module
409
-
410
- logger .debug ("V1 Programming model detected. Successfully loaded azure_functions_worker from:"
411
- f" { module .__file__ } " )
412
- except FileNotFoundError :
413
- logger .debug ("V2 Programming model detected. Skipping azure_functions_worker reload." )
414
-
415
381
async def _handle__worker_init_request (self , request ):
416
382
logger .info ('Received WorkerInitRequest, '
417
383
'python version %s, '
@@ -432,9 +398,12 @@ async def _handle__worker_init_request(self, request):
432
398
if DependencyManager .should_load_cx_dependencies ():
433
399
DependencyManager .prioritize_customer_dependencies ()
434
400
435
- self .reload_azure_functions_worker ()
401
+ import azure_functions_worker as worker
402
+ global library_worker
403
+ importlib .reload (worker )
404
+ library_worker = worker
436
405
437
- init_response = await azure_functions_worker .worker_init_request (init_request )
406
+ init_response = await library_worker .worker_init_request (init_request )
438
407
logger .info ("Finished WorkerInitRequest, request ID %s, worker id %s, " ,
439
408
self .request_id , self .worker_id )
440
409
@@ -456,12 +425,15 @@ async def _handle__function_environment_reload_request(self, request):
456
425
directory = func_env_reload_request .function_app_directory
457
426
DependencyManager .reload_customer_libraries (directory )
458
427
459
- self .reload_azure_functions_worker ()
428
+ import azure_functions_worker as worker
429
+ global library_worker
430
+ importlib .reload (worker )
431
+ library_worker = worker
460
432
461
433
env_reload_request = WorkerRequest (name = "FunctionEnvironmentReloadRequest" , request = request ,
462
434
properties = {"protos" : protos ,
463
435
"host" : self ._host })
464
- env_reload_response = await azure_functions_worker .function_environment_reload_request (env_reload_request )
436
+ env_reload_response = await library_worker .function_environment_reload_request (env_reload_request )
465
437
return protos .StreamingMessage (
466
438
request_id = self .request_id ,
467
439
function_environment_reload_response = env_reload_response )
@@ -481,7 +453,7 @@ async def _handle__functions_metadata_request(self, request):
481
453
self .request_id , self .worker_id )
482
454
483
455
metadata_request = WorkerRequest (name = "WorkerMetadataRequest" , request = request )
484
- metadata_response = await azure_functions_worker .functions_metadata_request (metadata_request )
456
+ metadata_response = await library_worker .functions_metadata_request (metadata_request )
485
457
486
458
return protos .StreamingMessage (
487
459
request_id = request .request_id ,
@@ -499,7 +471,7 @@ async def _handle__function_load_request(self, request):
499
471
self .request_id , function_id , function_name , self .worker_id )
500
472
501
473
load_request = WorkerRequest (name = "FunctionsLoadRequest" , request = request )
502
- load_response = await azure_functions_worker .function_load_request (load_request )
474
+ load_response = await library_worker .function_load_request (load_request )
503
475
504
476
return protos .StreamingMessage (
505
477
request_id = self .request_id ,
@@ -517,7 +489,7 @@ async def _handle__invocation_request(self, request):
517
489
518
490
invocation_request = WorkerRequest (name = "WorkerInvRequest" , request = request ,
519
491
properties = {"threadpool" : self ._sync_call_tp })
520
- invocation_response = await azure_functions_worker .invocation_request (invocation_request )
492
+ invocation_response = await library_worker .invocation_request (invocation_request )
521
493
return protos .StreamingMessage (
522
494
request_id = self .request_id ,
523
495
invocation_response = invocation_response )
0 commit comments