From a83e0033575eacac94e8f1cb8b78f400845889ce Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Thu, 5 Jun 2025 17:23:54 -0500 Subject: [PATCH 01/12] uv --- azure_functions_worker/main.py | 6 ++++-- pyproject.toml | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index 130e0e9ea..b8b87a7e1 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,6 +3,7 @@ """Main entrypoint.""" import argparse +import uvloop def parse_args(): @@ -45,8 +46,6 @@ def main(): DependencyManager.initialize() DependencyManager.use_worker_dependencies() - import asyncio - from . import logging from .logging import error_logger, format_exception, logger @@ -58,6 +57,9 @@ def main(): args.worker_id, args.request_id, args.host, args.port) try: + import asyncio + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + logger.debug('Using event loop: %s', type(asyncio.get_event_loop())) return asyncio.run(start_async( args.host, args.port, args.worker_id, args.request_id)) except Exception as ex: diff --git a/pyproject.toml b/pyproject.toml index ab3b897ba..bb15eb317 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,8 @@ dev = [ "pre-commit", "invoke", "cryptography", - "orjson" + "orjson", + "uvloop" ] test-http-v2 = [ "azurefunctions-extensions-http-fastapi==1.0.0", From 6bf3e45bd5b5f7619a51d484d52b7a12c157bc68 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Thu, 5 Jun 2025 17:27:06 -0500 Subject: [PATCH 02/12] reorder --- azure_functions_worker/main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index b8b87a7e1..614ed5c4c 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -45,6 +45,9 @@ def main(): from .utils.dependency import DependencyManager DependencyManager.initialize() DependencyManager.use_worker_dependencies() + + import asyncio + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) from . import logging from .logging import error_logger, format_exception, logger @@ -55,11 +58,9 @@ def main(): 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) + logger.debug('Using event loop: %s', type(asyncio.get_event_loop())) try: - import asyncio - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - logger.debug('Using event loop: %s', type(asyncio.get_event_loop())) return asyncio.run(start_async( args.host, args.port, args.worker_id, args.request_id)) except Exception as ex: From 8754c4f59de4fca167db6ef88a0c14d8f52b52fe Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Thu, 5 Jun 2025 17:28:23 -0500 Subject: [PATCH 03/12] ws --- azure_functions_worker/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index 614ed5c4c..e1d99abee 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -45,7 +45,7 @@ def main(): from .utils.dependency import DependencyManager DependencyManager.initialize() DependencyManager.use_worker_dependencies() - + import asyncio asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) From 24c9ed56ae66fe6f20a61b7f3531149d89236ae0 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 10:19:20 -0500 Subject: [PATCH 04/12] test without packages --- azure_functions_worker/main.py | 2 +- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index e1d99abee..c365c254a 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -47,7 +47,7 @@ def main(): DependencyManager.use_worker_dependencies() import asyncio - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + # asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) from . import logging from .logging import error_logger, format_exception, logger diff --git a/pyproject.toml b/pyproject.toml index bb15eb317..ab3b897ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,8 +80,7 @@ dev = [ "pre-commit", "invoke", "cryptography", - "orjson", - "uvloop" + "orjson" ] test-http-v2 = [ "azurefunctions-extensions-http-fastapi==1.0.0", From 72be6490fa251c8b3f93a744ca670f13cd9ecafd Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 10:27:46 -0500 Subject: [PATCH 05/12] test without packages --- azure_functions_worker/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index c365c254a..cf899163f 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,7 +3,6 @@ """Main entrypoint.""" import argparse -import uvloop def parse_args(): From 73e2e676213e0f5637c3f0d03d2736b6b24ecf09 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 10:43:49 -0500 Subject: [PATCH 06/12] chng to linux --- azure_functions_worker/main.py | 3 ++- eng/templates/jobs/ci-unit-tests.yml | 4 ++++ pyproject.toml | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index cf899163f..e1d99abee 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,6 +3,7 @@ """Main entrypoint.""" import argparse +import uvloop def parse_args(): @@ -46,7 +47,7 @@ def main(): DependencyManager.use_worker_dependencies() import asyncio - # asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) from . import logging from .logging import error_logger, format_exception, logger diff --git a/eng/templates/jobs/ci-unit-tests.yml b/eng/templates/jobs/ci-unit-tests.yml index 11acf05cd..d303eb787 100644 --- a/eng/templates/jobs/ci-unit-tests.yml +++ b/eng/templates/jobs/ci-unit-tests.yml @@ -18,6 +18,10 @@ jobs: PYTHON_VERSION: '3.12' Python313: PYTHON_VERSION: '3.13' + pool: + name: ${{ parameters.PoolName }} + image: 1es-ubuntu-22.04 + os: linux steps: - task: UsePythonVersion@0 inputs: diff --git a/pyproject.toml b/pyproject.toml index ab3b897ba..bb15eb317 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,8 @@ dev = [ "pre-commit", "invoke", "cryptography", - "orjson" + "orjson", + "uvloop" ] test-http-v2 = [ "azurefunctions-extensions-http-fastapi==1.0.0", From 47aca39408e8f71f944b337c38ea54a05734c304 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 14:06:13 -0500 Subject: [PATCH 07/12] add uvloop --- azure_functions_worker/main.py | 4 +++- eng/pack/templates/macos_64_env_gen.yml | 1 + eng/pack/templates/nix_arm64_env_gen.yml | 1 + eng/pack/templates/nix_env_gen.yml | 1 + eng/pack/templates/win_env_gen.yml | 1 + pyproject.toml | 4 ++-- 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index e1d99abee..fd3f59404 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -4,6 +4,7 @@ import argparse import uvloop +import sys def parse_args(): @@ -47,7 +48,8 @@ def main(): DependencyManager.use_worker_dependencies() import asyncio - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + if sys.platform != 'win32': + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) from . import logging from .logging import error_logger, format_exception, logger diff --git a/eng/pack/templates/macos_64_env_gen.yml b/eng/pack/templates/macos_64_env_gen.yml index 0ab5d9054..8dd023c5e 100644 --- a/eng/pack/templates/macos_64_env_gen.yml +++ b/eng/pack/templates/macos_64_env_gen.yml @@ -92,6 +92,7 @@ steps: !werkzeug/debug/shared/debugger.js !azure_functions_worker/** !dateutil/** + !uvloop/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) displayName: 'Copy proxy_worker files' diff --git a/eng/pack/templates/nix_arm64_env_gen.yml b/eng/pack/templates/nix_arm64_env_gen.yml index 5d3167bd8..a7d9578d3 100644 --- a/eng/pack/templates/nix_arm64_env_gen.yml +++ b/eng/pack/templates/nix_arm64_env_gen.yml @@ -97,6 +97,7 @@ steps: !*.dist-info/** !werkzeug/debug/shared/debugger.js !dateutil/** + !uvloop/** !azure_functions_worker/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) diff --git a/eng/pack/templates/nix_env_gen.yml b/eng/pack/templates/nix_env_gen.yml index 982949ce4..7a6e1c8f9 100644 --- a/eng/pack/templates/nix_env_gen.yml +++ b/eng/pack/templates/nix_env_gen.yml @@ -91,6 +91,7 @@ steps: !*.dist-info/** !werkzeug/debug/shared/debugger.js !dateutil/** + !uvloop/** !azure_functions_worker/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) diff --git a/eng/pack/templates/win_env_gen.yml b/eng/pack/templates/win_env_gen.yml index 988c688e0..7efe297f6 100644 --- a/eng/pack/templates/win_env_gen.yml +++ b/eng/pack/templates/win_env_gen.yml @@ -90,6 +90,7 @@ steps: !*.dist-info\** !werkzeug\debug\shared\debugger.js !dateutil\** + !uvloop/** !azure_functions_worker\** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) diff --git a/pyproject.toml b/pyproject.toml index bb15eb317..77fa95edb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ classifiers = [ dependencies = [ "azure-functions==1.24.0b3", "python-dateutil~=2.9.0", + "uvloop~=0.21.0; python_version >= '3.8'", "protobuf~=3.19.3; python_version == '3.7'", "protobuf~=4.25.3; python_version >= '3.8' and python_version < '3.13'", "protobuf~=5.29.0; python_version >= '3.13'", @@ -80,8 +81,7 @@ dev = [ "pre-commit", "invoke", "cryptography", - "orjson", - "uvloop" + "orjson" ] test-http-v2 = [ "azurefunctions-extensions-http-fastapi==1.0.0", From ed190baaf01dfed3f69e1ee0d6b1141bad776499 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 14:41:18 -0500 Subject: [PATCH 08/12] no windows --- azure_functions_worker/main.py | 2 +- eng/pack/templates/win_env_gen.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index fd3f59404..9c700ab3c 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,7 +3,6 @@ """Main entrypoint.""" import argparse -import uvloop import sys @@ -49,6 +48,7 @@ def main(): import asyncio if sys.platform != 'win32': + import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) from . import logging diff --git a/eng/pack/templates/win_env_gen.yml b/eng/pack/templates/win_env_gen.yml index 7efe297f6..988c688e0 100644 --- a/eng/pack/templates/win_env_gen.yml +++ b/eng/pack/templates/win_env_gen.yml @@ -90,7 +90,6 @@ steps: !*.dist-info\** !werkzeug\debug\shared\debugger.js !dateutil\** - !uvloop/** !azure_functions_worker\** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) From 53aac498e1916116d9bad8d581c935f600d8961c Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 6 Jun 2025 15:54:33 -0500 Subject: [PATCH 09/12] catch --- azure_functions_worker/main.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index 9c700ab3c..af7ffc470 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -48,8 +48,11 @@ def main(): import asyncio if sys.platform != 'win32': - import uvloop - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + try: + import uvloop + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + except ImportError: + pass from . import logging from .logging import error_logger, format_exception, logger From 4c0b72dba437691a659bc5fe3b5c31350639d5ea Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 16 Jun 2025 13:47:10 -0500 Subject: [PATCH 10/12] only allow cx to install --- eng/pack/templates/macos_64_env_gen.yml | 1 - eng/pack/templates/nix_arm64_env_gen.yml | 1 - eng/pack/templates/nix_env_gen.yml | 1 - eng/templates/jobs/ci-unit-tests.yml | 4 ---- pyproject.toml | 1 - 5 files changed, 8 deletions(-) diff --git a/eng/pack/templates/macos_64_env_gen.yml b/eng/pack/templates/macos_64_env_gen.yml index 8dd023c5e..0ab5d9054 100644 --- a/eng/pack/templates/macos_64_env_gen.yml +++ b/eng/pack/templates/macos_64_env_gen.yml @@ -92,7 +92,6 @@ steps: !werkzeug/debug/shared/debugger.js !azure_functions_worker/** !dateutil/** - !uvloop/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) displayName: 'Copy proxy_worker files' diff --git a/eng/pack/templates/nix_arm64_env_gen.yml b/eng/pack/templates/nix_arm64_env_gen.yml index a7d9578d3..5d3167bd8 100644 --- a/eng/pack/templates/nix_arm64_env_gen.yml +++ b/eng/pack/templates/nix_arm64_env_gen.yml @@ -97,7 +97,6 @@ steps: !*.dist-info/** !werkzeug/debug/shared/debugger.js !dateutil/** - !uvloop/** !azure_functions_worker/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) diff --git a/eng/pack/templates/nix_env_gen.yml b/eng/pack/templates/nix_env_gen.yml index 7a6e1c8f9..982949ce4 100644 --- a/eng/pack/templates/nix_env_gen.yml +++ b/eng/pack/templates/nix_env_gen.yml @@ -91,7 +91,6 @@ steps: !*.dist-info/** !werkzeug/debug/shared/debugger.js !dateutil/** - !uvloop/** !azure_functions_worker/** targetFolder: '$(Build.ArtifactStagingDirectory)' condition: eq(variables['proxyWorker'], true) diff --git a/eng/templates/jobs/ci-unit-tests.yml b/eng/templates/jobs/ci-unit-tests.yml index d303eb787..11acf05cd 100644 --- a/eng/templates/jobs/ci-unit-tests.yml +++ b/eng/templates/jobs/ci-unit-tests.yml @@ -18,10 +18,6 @@ jobs: PYTHON_VERSION: '3.12' Python313: PYTHON_VERSION: '3.13' - pool: - name: ${{ parameters.PoolName }} - image: 1es-ubuntu-22.04 - os: linux steps: - task: UsePythonVersion@0 inputs: diff --git a/pyproject.toml b/pyproject.toml index 77fa95edb..ab3b897ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,6 @@ classifiers = [ dependencies = [ "azure-functions==1.24.0b3", "python-dateutil~=2.9.0", - "uvloop~=0.21.0; python_version >= '3.8'", "protobuf~=3.19.3; python_version == '3.7'", "protobuf~=4.25.3; python_version >= '3.8' and python_version < '3.13'", "protobuf~=5.29.0; python_version >= '3.13'", From 9ecbc30fa6c499dc708e1e0354d9ac990f739343 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 16 Jun 2025 13:50:41 -0500 Subject: [PATCH 11/12] weaken check --- azure_functions_worker/main.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index af7ffc470..c2b6db8c9 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,7 +3,6 @@ """Main entrypoint.""" import argparse -import sys def parse_args(): @@ -47,12 +46,11 @@ def main(): DependencyManager.use_worker_dependencies() import asyncio - if sys.platform != 'win32': - try: - import uvloop - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - except ImportError: - pass + try: + import uvloop + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + except Exception: + pass from . import logging from .logging import error_logger, format_exception, logger From 36eafbc3be43a0b73dfd203c0608902e27d2668d Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Fri, 27 Jun 2025 13:10:55 -0500 Subject: [PATCH 12/12] fix --- azure_functions_worker/main.py | 13 ++++++------- azure_functions_worker/utils/dependency.py | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/azure_functions_worker/main.py b/azure_functions_worker/main.py index c2b6db8c9..2bd5ddd3b 100644 --- a/azure_functions_worker/main.py +++ b/azure_functions_worker/main.py @@ -3,6 +3,12 @@ """Main entrypoint.""" import argparse +import asyncio +try: + import uvloop + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) +except Exception: + pass def parse_args(): @@ -45,13 +51,6 @@ def main(): DependencyManager.initialize() DependencyManager.use_worker_dependencies() - import asyncio - try: - import uvloop - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - except Exception: - pass - from . import logging from .logging import error_logger, format_exception, logger diff --git a/azure_functions_worker/utils/dependency.py b/azure_functions_worker/utils/dependency.py index 76d4259be..3559cef98 100644 --- a/azure_functions_worker/utils/dependency.py +++ b/azure_functions_worker/utils/dependency.py @@ -95,7 +95,7 @@ def should_load_cx_dependencies(cls): ) def use_worker_dependencies(cls): """Switch the sys.path and ensure the worker imports are loaded from - Worker's dependenciess. + Worker's dependencies. This will not affect already imported namespaces, but will clear out the module cache and ensure the upcoming modules are loaded from