modAL 1.2.3.dev2__tar.gz → 1.2.3.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/PKG-INFO +1 -1
  2. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/async_utils.py +15 -5
  3. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/client.pyi +2 -2
  4. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/PKG-INFO +1 -1
  5. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_version/__init__.py +1 -1
  6. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/LICENSE +0 -0
  7. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/README.md +0 -0
  8. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/__init__.py +0 -0
  9. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/__main__.py +0 -0
  10. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_billing.py +0 -0
  11. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_clustered_functions.py +0 -0
  12. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_functions.py +0 -0
  15. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_grpc_client.py +0 -0
  16. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_ipython.py +0 -0
  17. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_load_context.py +0 -0
  18. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_location.py +0 -0
  19. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_object.py +0 -0
  20. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_output.py +0 -0
  21. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_partial_function.py +0 -0
  22. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_pty.py +0 -0
  23. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_resolver.py +0 -0
  24. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_resources.py +0 -0
  25. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_serialization.py +0 -0
  35. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_traceback.py +0 -0
  36. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_tunnel.py +0 -0
  37. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_tunnel.pyi +0 -0
  38. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_type_manager.py +0 -0
  39. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/__init__.py +0 -0
  40. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/auth_token_manager.py +0 -0
  42. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/logger.py +0 -0
  54. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/task_command_router_client.py +0 -0
  61. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_utils/time_utils.py +0 -0
  62. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_vendor/__init__.py +0 -0
  63. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  64. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_vendor/cloudpickle.py +0 -0
  65. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_vendor/tblib.py +0 -0
  66. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/_watcher.py +0 -0
  67. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/app.py +0 -0
  68. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/app.pyi +0 -0
  69. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/billing.py +0 -0
  70. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/2023.12.312.txt +0 -0
  71. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/2023.12.txt +0 -0
  72. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/2024.04.txt +0 -0
  73. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/2024.10.txt +0 -0
  74. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/2025.06.txt +0 -0
  75. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/PREVIEW.txt +0 -0
  76. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/README.md +0 -0
  77. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/builder/base-images.json +0 -0
  78. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/call_graph.py +0 -0
  79. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/__init__.py +0 -0
  80. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/_download.py +0 -0
  81. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/_traceback.py +0 -0
  82. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/app.py +0 -0
  83. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/cluster.py +0 -0
  84. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/config.py +0 -0
  85. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/container.py +0 -0
  86. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/dict.py +0 -0
  87. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/entry_point.py +0 -0
  88. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/environment.py +0 -0
  89. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/import_refs.py +0 -0
  90. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/launch.py +0 -0
  91. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/network_file_system.py +0 -0
  92. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/profile.py +0 -0
  93. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/programs/__init__.py +0 -0
  94. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/programs/launch_instance_ssh.py +0 -0
  95. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/programs/run_jupyter.py +0 -0
  96. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/programs/run_marimo.py +0 -0
  97. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/programs/vscode.py +0 -0
  98. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/queues.py +0 -0
  99. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/run.py +0 -0
  100. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/secret.py +0 -0
  101. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/token.py +0 -0
  102. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/utils.py +0 -0
  103. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cli/volume.py +0 -0
  104. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/client.py +0 -0
  105. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cloud_bucket_mount.py +0 -0
  106. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cloud_bucket_mount.pyi +0 -0
  107. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cls.py +0 -0
  108. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/cls.pyi +0 -0
  109. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/config.py +0 -0
  110. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/container_process.py +0 -0
  111. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/container_process.pyi +0 -0
  112. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/dict.py +0 -0
  113. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/dict.pyi +0 -0
  114. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/environments.py +0 -0
  115. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/environments.pyi +0 -0
  116. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/exception.py +0 -0
  117. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/experimental/__init__.py +0 -0
  118. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/experimental/flash.py +0 -0
  119. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/experimental/flash.pyi +0 -0
  120. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/experimental/ipython.py +0 -0
  121. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/file_io.py +0 -0
  122. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/file_io.pyi +0 -0
  123. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/file_pattern_matcher.py +0 -0
  124. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/functions.py +0 -0
  125. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/functions.pyi +0 -0
  126. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/gpu.py +0 -0
  127. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/image.py +0 -0
  128. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/image.pyi +0 -0
  129. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/io_streams.py +0 -0
  130. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/io_streams.pyi +0 -0
  131. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/mount.py +0 -0
  132. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/mount.pyi +0 -0
  133. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/network_file_system.py +0 -0
  134. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/network_file_system.pyi +0 -0
  135. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/object.py +0 -0
  136. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/object.pyi +0 -0
  137. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/output.py +0 -0
  138. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/parallel_map.py +0 -0
  139. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/parallel_map.pyi +0 -0
  140. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/partial_function.py +0 -0
  141. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/partial_function.pyi +0 -0
  142. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/proxy.py +0 -0
  143. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/proxy.pyi +0 -0
  144. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/py.typed +0 -0
  145. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/queue.py +0 -0
  146. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/queue.pyi +0 -0
  147. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/retries.py +0 -0
  148. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/runner.py +0 -0
  149. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/runner.pyi +0 -0
  150. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/running_app.py +0 -0
  151. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/sandbox.py +0 -0
  152. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/sandbox.pyi +0 -0
  153. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/schedule.py +0 -0
  154. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/scheduler_placement.py +0 -0
  155. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/secret.py +0 -0
  156. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/secret.pyi +0 -0
  157. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/serving.py +0 -0
  158. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/serving.pyi +0 -0
  159. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/snapshot.py +0 -0
  160. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/snapshot.pyi +0 -0
  161. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/stream_type.py +0 -0
  162. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/token_flow.py +0 -0
  163. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/token_flow.pyi +0 -0
  164. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/volume.py +0 -0
  165. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal/volume.pyi +0 -0
  166. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/SOURCES.txt +0 -0
  167. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/dependency_links.txt +0 -0
  168. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/entry_points.txt +0 -0
  169. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/requires.txt +0 -0
  170. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal.egg-info/top_level.txt +0 -0
  171. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/__init__.py +0 -0
  172. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/gen_cli_docs.py +0 -0
  173. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/gen_reference_docs.py +0 -0
  174. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/mdmd/__init__.py +0 -0
  175. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/mdmd/mdmd.py +0 -0
  176. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_docs/mdmd/signatures.py +0 -0
  177. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/__init__.py +0 -0
  178. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api.proto +0 -0
  179. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api_grpc.py +0 -0
  180. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api_pb2.py +0 -0
  181. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api_pb2.pyi +0 -0
  182. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api_pb2_grpc.py +0 -0
  183. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/api_pb2_grpc.pyi +0 -0
  184. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/modal_api_grpc.py +0 -0
  185. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/py.typed +0 -0
  186. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router.proto +0 -0
  187. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router_grpc.py +0 -0
  188. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router_pb2.py +0 -0
  189. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router_pb2.pyi +0 -0
  190. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  191. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  192. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router.proto +0 -0
  193. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router_grpc.py +0 -0
  194. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router_pb2.py +0 -0
  195. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router_pb2.pyi +0 -0
  196. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  197. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  198. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/modal_version/__main__.py +0 -0
  199. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/pyproject.toml +0 -0
  200. {modal-1.2.3.dev2 → modal-1.2.3.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.3.dev2
3
+ Version: 1.2.3.dev4
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,12 +1,14 @@
1
1
  # Copyright Modal Labs 2022
2
2
  import asyncio
3
3
  import concurrent.futures
4
+ import contextlib
4
5
  import functools
5
6
  import inspect
6
7
  import itertools
7
8
  import sys
8
9
  import time
9
10
  import typing
11
+ import warnings
10
12
  from collections.abc import AsyncGenerator, AsyncIterable, Awaitable, Iterable, Iterator
11
13
  from contextlib import asynccontextmanager
12
14
  from dataclasses import dataclass
@@ -134,7 +136,8 @@ class TaskContext:
134
136
  _loops: set[asyncio.Task]
135
137
 
136
138
  def __init__(self, grace: Optional[float] = None):
137
- self._grace = grace
139
+ self._grace = grace # grace is the time we want for tasks to finish before cancelling them
140
+ self._cancellation_grace: float = 1.0 # extra graceperiod for the cancellation itself to "bubble up"
138
141
  self._loops = set()
139
142
 
140
143
  async def start(self):
@@ -166,22 +169,29 @@ class TaskContext:
166
169
  # still needs to be handled
167
170
  # (https://stackoverflow.com/a/63356323/2475114)
168
171
  if gather_future:
169
- try:
172
+ with contextlib.suppress(asyncio.CancelledError):
170
173
  await gather_future
171
- except asyncio.CancelledError:
172
- pass
173
174
 
175
+ cancelled_tasks: list[asyncio.Task] = []
174
176
  for task in self._tasks:
175
177
  if task.done() and not task.cancelled():
176
178
  # Raise any exceptions if they happened.
177
179
  # Only tasks without a done_callback will still be present in self._tasks
178
180
  task.result()
179
181
 
180
- if task.done() or task in self._loops: # Note: Legacy code, we can probably cancel loops.
182
+ if task.done():
181
183
  continue
182
184
 
183
185
  # Cancel any remaining unfinished tasks.
184
186
  task.cancel()
187
+ cancelled_tasks.append(task)
188
+
189
+ cancellation_gather = asyncio.gather(*cancelled_tasks, return_exceptions=True)
190
+ try:
191
+ await asyncio.wait_for(cancellation_gather, timeout=self._cancellation_grace)
192
+ except asyncio.TimeoutError:
193
+ warnings.warn(f"Internal warning: Tasks did not cancel in a timely manner: {cancelled_tasks}")
194
+
185
195
  await asyncio.sleep(0) # wake up coroutines waiting for cancellations
186
196
 
187
197
  async def __aexit__(self, exc_type, value, tb):
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.2.3.dev2",
36
+ version: str = "1.2.3.dev4",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.2.3.dev2",
167
+ version: str = "1.2.3.dev4",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.3.dev2
3
+ Version: 1.2.3.dev4
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.2.3.dev2"
4
+ __version__ = "1.2.3.dev4"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes