modal 1.2.3.dev2__tar.gz → 1.2.3.dev3__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.dev3}/PKG-INFO +1 -1
  2. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/async_utils.py +15 -5
  3. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/client.pyi +2 -2
  4. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/functions.pyi +6 -6
  5. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_version/__init__.py +1 -1
  7. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/LICENSE +0 -0
  8. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/README.md +0 -0
  9. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/__init__.py +0 -0
  10. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/__main__.py +0 -0
  11. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_billing.py +0 -0
  12. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_clustered_functions.py +0 -0
  13. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_container_entrypoint.py +0 -0
  15. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_functions.py +0 -0
  16. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_grpc_client.py +0 -0
  17. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_ipython.py +0 -0
  18. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_load_context.py +0 -0
  19. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_location.py +0 -0
  20. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_object.py +0 -0
  21. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_output.py +0 -0
  22. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_partial_function.py +0 -0
  23. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_pty.py +0 -0
  24. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_resolver.py +0 -0
  25. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_resources.py +0 -0
  26. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_serialization.py +0 -0
  36. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_traceback.py +0 -0
  37. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_tunnel.py +0 -0
  38. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_tunnel.pyi +0 -0
  39. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_type_manager.py +0 -0
  40. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/__init__.py +0 -0
  41. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/auth_token_manager.py +0 -0
  43. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/blob_utils.py +0 -0
  44. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/function_utils.py +0 -0
  48. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/logger.py +0 -0
  55. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/task_command_router_client.py +0 -0
  62. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_utils/time_utils.py +0 -0
  63. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_vendor/__init__.py +0 -0
  64. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  65. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_vendor/cloudpickle.py +0 -0
  66. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_vendor/tblib.py +0 -0
  67. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/_watcher.py +0 -0
  68. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/app.py +0 -0
  69. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/app.pyi +0 -0
  70. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/billing.py +0 -0
  71. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/2023.12.312.txt +0 -0
  72. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/2023.12.txt +0 -0
  73. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/2024.04.txt +0 -0
  74. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/2024.10.txt +0 -0
  75. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/2025.06.txt +0 -0
  76. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/PREVIEW.txt +0 -0
  77. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/README.md +0 -0
  78. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/builder/base-images.json +0 -0
  79. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/call_graph.py +0 -0
  80. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/__init__.py +0 -0
  81. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/_download.py +0 -0
  82. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/_traceback.py +0 -0
  83. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/app.py +0 -0
  84. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/cluster.py +0 -0
  85. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/config.py +0 -0
  86. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/container.py +0 -0
  87. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/dict.py +0 -0
  88. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/entry_point.py +0 -0
  89. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/environment.py +0 -0
  90. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/import_refs.py +0 -0
  91. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/launch.py +0 -0
  92. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/network_file_system.py +0 -0
  93. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/profile.py +0 -0
  94. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/programs/__init__.py +0 -0
  95. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/programs/launch_instance_ssh.py +0 -0
  96. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/programs/run_jupyter.py +0 -0
  97. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/programs/run_marimo.py +0 -0
  98. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/programs/vscode.py +0 -0
  99. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/queues.py +0 -0
  100. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/run.py +0 -0
  101. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/secret.py +0 -0
  102. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/token.py +0 -0
  103. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/utils.py +0 -0
  104. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cli/volume.py +0 -0
  105. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/client.py +0 -0
  106. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cloud_bucket_mount.py +0 -0
  107. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cloud_bucket_mount.pyi +0 -0
  108. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cls.py +0 -0
  109. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/cls.pyi +0 -0
  110. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/config.py +0 -0
  111. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/container_process.py +0 -0
  112. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/container_process.pyi +0 -0
  113. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/dict.py +0 -0
  114. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/dict.pyi +0 -0
  115. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/environments.py +0 -0
  116. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/environments.pyi +0 -0
  117. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/exception.py +0 -0
  118. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/experimental/__init__.py +0 -0
  119. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/experimental/flash.py +0 -0
  120. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/experimental/flash.pyi +0 -0
  121. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/experimental/ipython.py +0 -0
  122. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/file_io.py +0 -0
  123. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/file_io.pyi +0 -0
  124. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/file_pattern_matcher.py +0 -0
  125. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/functions.py +0 -0
  126. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/gpu.py +0 -0
  127. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/image.py +0 -0
  128. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/image.pyi +0 -0
  129. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/io_streams.py +0 -0
  130. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/io_streams.pyi +0 -0
  131. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/mount.py +0 -0
  132. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/mount.pyi +0 -0
  133. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/network_file_system.py +0 -0
  134. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/network_file_system.pyi +0 -0
  135. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/object.py +0 -0
  136. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/object.pyi +0 -0
  137. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/output.py +0 -0
  138. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/parallel_map.py +0 -0
  139. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/parallel_map.pyi +0 -0
  140. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/partial_function.py +0 -0
  141. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/partial_function.pyi +0 -0
  142. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/proxy.py +0 -0
  143. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/proxy.pyi +0 -0
  144. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/py.typed +0 -0
  145. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/queue.py +0 -0
  146. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/queue.pyi +0 -0
  147. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/retries.py +0 -0
  148. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/runner.py +0 -0
  149. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/runner.pyi +0 -0
  150. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/running_app.py +0 -0
  151. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/sandbox.py +0 -0
  152. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/sandbox.pyi +0 -0
  153. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/schedule.py +0 -0
  154. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/scheduler_placement.py +0 -0
  155. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/secret.py +0 -0
  156. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/secret.pyi +0 -0
  157. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/serving.py +0 -0
  158. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/serving.pyi +0 -0
  159. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/snapshot.py +0 -0
  160. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/snapshot.pyi +0 -0
  161. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/stream_type.py +0 -0
  162. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/token_flow.py +0 -0
  163. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/token_flow.pyi +0 -0
  164. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/volume.py +0 -0
  165. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal/volume.pyi +0 -0
  166. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/SOURCES.txt +0 -0
  167. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/dependency_links.txt +0 -0
  168. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/entry_points.txt +0 -0
  169. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/requires.txt +0 -0
  170. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal.egg-info/top_level.txt +0 -0
  171. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/__init__.py +0 -0
  172. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/gen_cli_docs.py +0 -0
  173. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/gen_reference_docs.py +0 -0
  174. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/mdmd/__init__.py +0 -0
  175. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/mdmd/mdmd.py +0 -0
  176. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_docs/mdmd/signatures.py +0 -0
  177. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/__init__.py +0 -0
  178. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api.proto +0 -0
  179. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api_grpc.py +0 -0
  180. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api_pb2.py +0 -0
  181. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api_pb2.pyi +0 -0
  182. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api_pb2_grpc.py +0 -0
  183. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
  184. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/modal_api_grpc.py +0 -0
  185. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/py.typed +0 -0
  186. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router.proto +0 -0
  187. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router_grpc.py +0 -0
  188. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2.py +0 -0
  189. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2.pyi +0 -0
  190. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  191. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  192. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router.proto +0 -0
  193. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router_grpc.py +0 -0
  194. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2.py +0 -0
  195. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
  196. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  197. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  198. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/modal_version/__main__.py +0 -0
  199. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/pyproject.toml +0 -0
  200. {modal-1.2.3.dev2 → modal-1.2.3.dev3}/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.dev3
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.dev3",
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.dev3",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -408,7 +408,7 @@ class Function(
408
408
 
409
409
  _call_generator: ___call_generator_spec[typing_extensions.Self]
410
410
 
411
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
411
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
412
412
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
413
413
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
414
414
  ...
@@ -417,7 +417,7 @@ class Function(
417
417
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
418
418
  ...
419
419
 
420
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
420
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
421
421
 
422
422
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
423
423
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -444,7 +444,7 @@ class Function(
444
444
  """
445
445
  ...
446
446
 
447
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
447
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
448
448
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
449
449
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
450
450
 
@@ -468,7 +468,7 @@ class Function(
468
468
  ...
469
469
 
470
470
  _experimental_spawn: ___experimental_spawn_spec[
471
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
471
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
472
472
  ]
473
473
 
474
474
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -477,7 +477,7 @@ class Function(
477
477
 
478
478
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
479
479
 
480
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
480
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
481
481
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
482
482
  """Calls the function with the given arguments, without waiting for the results.
483
483
 
@@ -498,7 +498,7 @@ class Function(
498
498
  """
499
499
  ...
500
500
 
501
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
501
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
502
502
 
503
503
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
504
504
  """Return the inner Python object wrapped by this Modal Function."""
@@ -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.dev3
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.dev3"
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