xoscar 0.7.17__cp310-cp310-win_amd64.whl → 0.8.0__cp310-cp310-win_amd64.whl

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.

Potentially problematic release.


This version of xoscar might be problematic. Click here for more details.

Binary file
@@ -31,7 +31,7 @@ from urllib.parse import urlparse
31
31
  from ..._utils import to_binary
32
32
  from ...constants import XOSCAR_CONNECT_TIMEOUT, XOSCAR_UNIX_SOCKET_DIR
33
33
  from ...serialization import AioDeserializer, AioSerializer, deserialize
34
- from ...utils import classproperty, implements, is_py_312, is_v6_ip
34
+ from ...utils import classproperty, implements, is_py_312, is_py_312_or_above, is_v6_ip
35
35
  from .base import Channel, ChannelType, Client, Server
36
36
  from .core import register_client, register_server
37
37
  from .errors import ChannelClosed
@@ -192,9 +192,9 @@ class _BaseSocketServer(Server, metaclass=ABCMeta):
192
192
  @implements(Server.stop)
193
193
  async def stop(self):
194
194
  self._aio_server.close()
195
- # Python 3.12: # https://github.com/python/cpython/issues/104344
196
- # `wait_closed` leads to hang
197
- if not is_py_312():
195
+ # Python 3.12+: # https://github.com/python/cpython/issues/104344
196
+ # `wait_closed` leads to hang in Python 3.12 and 3.13
197
+ if not is_py_312_or_above():
198
198
  await self._aio_server.wait_closed()
199
199
  # close all channels
200
200
  await asyncio.gather(
xoscar/backends/core.py CHANGED
@@ -244,7 +244,27 @@ def _cancel_all_tasks(loop):
244
244
  for task in to_cancel:
245
245
  task.cancel()
246
246
 
247
- loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True))
247
+ # In Python 3.13+, we need to use a different approach to avoid deadlocks
248
+ # when shutting down event loops in threads
249
+ if hasattr(asyncio, "run"):
250
+ # For Python 3.13+, use a more robust approach
251
+ async def _gather_cancelled():
252
+ await asyncio.gather(*to_cancel, return_exceptions=True)
253
+
254
+ try:
255
+ # Try to run the gather in the current loop context
256
+ if loop.is_running():
257
+ # If loop is running, schedule the gather
258
+ asyncio.run_coroutine_threadsafe(_gather_cancelled(), loop)
259
+ else:
260
+ # If loop is not running, we can run it directly
261
+ loop.run_until_complete(_gather_cancelled())
262
+ except RuntimeError:
263
+ # If we can't run the gather, just log and continue
264
+ logger.debug("Could not gather cancelled tasks during shutdown")
265
+ else:
266
+ # For older Python versions, use the original approach
267
+ loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True))
248
268
 
249
269
  for task in to_cancel:
250
270
  if task.cancelled():
@@ -263,8 +283,15 @@ def _safe_run_forever(loop):
263
283
  try:
264
284
  loop.run_forever()
265
285
  finally:
266
- _cancel_all_tasks(loop)
267
- loop.stop()
286
+ try:
287
+ _cancel_all_tasks(loop)
288
+ except Exception as e:
289
+ logger.debug("Error during task cancellation: %s", e)
290
+ finally:
291
+ try:
292
+ loop.stop()
293
+ except Exception as e:
294
+ logger.debug("Error stopping loop: %s", e)
268
295
 
269
296
 
270
297
  class ActorCaller:
@@ -273,12 +300,31 @@ class ActorCaller:
273
300
  class _RefHolder:
274
301
  pass
275
302
 
276
- _close_loop = asyncio.new_event_loop()
277
- _close_thread = threading.Thread(
278
- target=_safe_run_forever, args=(_close_loop,), daemon=True
279
- )
280
- _close_thread.start()
281
- atexit.register(_close_loop.call_soon_threadsafe, _close_loop.stop)
303
+ _close_loop = None
304
+ _close_thread = None
305
+ _initialized = False
306
+
307
+ @classmethod
308
+ def _ensure_initialized(cls):
309
+ if not cls._initialized:
310
+ cls._close_loop = asyncio.new_event_loop()
311
+ cls._close_thread = threading.Thread(
312
+ target=_safe_run_forever, args=(cls._close_loop,), daemon=True
313
+ )
314
+ cls._close_thread.start()
315
+ atexit.register(cls._cleanup)
316
+ cls._initialized = True
317
+
318
+ @classmethod
319
+ def _cleanup(cls):
320
+ if cls._close_loop and cls._close_loop.is_running():
321
+ try:
322
+ cls._close_loop.call_soon_threadsafe(cls._close_loop.stop)
323
+ # Give the loop a moment to stop
324
+ if cls._close_thread:
325
+ cls._close_thread.join(timeout=0.5) # Shorter timeout for tests
326
+ except Exception as e:
327
+ logger.debug("Error during cleanup: %s", e)
282
328
 
283
329
  def __init__(self):
284
330
  self._thread_local = threading.local()
@@ -294,6 +340,8 @@ class ActorCaller:
294
340
  # If the thread exit, we clean the related actor callers and channels.
295
341
 
296
342
  def _cleanup():
343
+ self._ensure_initialized()
344
+ # Use the background thread for cleanup
297
345
  asyncio.run_coroutine_threadsafe(actor_caller.stop(), self._close_loop)
298
346
  logger.debug(
299
347
  "Clean up the actor caller due to thread exit: %s", thread_info
@@ -418,26 +418,70 @@ class MainActorPool(MainActorPoolBase):
418
418
  async def kill_sub_pool(
419
419
  self, process: asyncio.subprocess.Process, force: bool = False
420
420
  ):
421
+ # First, try to terminate the process gracefully
422
+ if not force:
423
+ try:
424
+ process.terminate()
425
+ # Wait for graceful termination
426
+ try:
427
+ await asyncio.wait_for(process.wait(), timeout=2.0)
428
+ except asyncio.TimeoutError:
429
+ # Process didn't terminate gracefully, force kill
430
+ force = True
431
+ except ProcessLookupError:
432
+ # Process already terminated
433
+ pass
434
+
435
+ # Force kill if needed or if graceful termination failed
436
+ if force:
437
+ try:
438
+ process.kill()
439
+ except ProcessLookupError:
440
+ # Process already dead
441
+ pass
442
+
443
+ # Ensure process is completely terminated and cleaned up
421
444
  try:
422
- p = psutil.Process(process.pid)
423
- except psutil.NoSuchProcess:
424
- return
445
+ # Wait for process to complete
446
+ if process.returncode is None:
447
+ try:
448
+ await asyncio.wait_for(process.wait(), timeout=5.0)
449
+ except asyncio.TimeoutError:
450
+ pass
451
+ except ProcessLookupError:
452
+ # Process already terminated
453
+ pass
425
454
 
426
- if not force: # pragma: no cover
427
- p.terminate()
455
+ # Python 3.13 specific cleanup for waitpid threads
456
+ if sys.version_info >= (3, 13):
428
457
  try:
429
- p.wait(5)
430
- except psutil.TimeoutExpired:
458
+ # Close the transport to clean up waitpid thread
459
+ if hasattr(process, "_transport") and process._transport:
460
+ process._transport.close()
461
+ # Also try to close the pipe transport if it exists
462
+ if hasattr(process, "_pipes") and process._pipes:
463
+ for pipe in process._pipes.values():
464
+ if hasattr(pipe, "close"):
465
+ pipe.close()
466
+ except Exception:
467
+ # Ignore errors during cleanup
431
468
  pass
432
469
 
433
- count = 0
434
- while p.is_running() and count < 3:
435
- count += 1
436
- p.kill()
437
- if not p.is_running():
438
- return
439
- logger.info("Sub pool can't be killed: %s", p)
440
- time.sleep(0.1)
470
+ # Additional cleanup using psutil to ensure process tree is terminated
471
+ try:
472
+ p = psutil.Process(process.pid)
473
+ if p.is_running():
474
+ # Kill the entire process tree
475
+ for child in p.children(recursive=True):
476
+ try:
477
+ child.kill()
478
+ except psutil.NoSuchProcess:
479
+ pass
480
+ p.kill()
481
+ p.wait(timeout=2.0)
482
+ except (psutil.NoSuchProcess, psutil.TimeoutExpired):
483
+ # Process already dead or couldn't be killed
484
+ pass
441
485
 
442
486
  async def is_sub_pool_alive(self, process: asyncio.subprocess.Process):
443
487
  return process.returncode is None
Binary file
xoscar/backends/pool.py CHANGED
@@ -1337,7 +1337,9 @@ class MainActorPoolBase(ActorPoolBase):
1337
1337
  return pool
1338
1338
 
1339
1339
  async def start_monitor(self):
1340
- if self._monitor_task is None:
1340
+ # Only start monitor if there are sub processes to monitor
1341
+ # This prevents hanging when n_process=0
1342
+ if self._monitor_task is None and self.sub_processes:
1341
1343
  self._monitor_task = asyncio.create_task(self.monitor_sub_pools())
1342
1344
  return self._monitor_task
1343
1345
 
@@ -1351,7 +1353,12 @@ class MainActorPoolBase(ActorPoolBase):
1351
1353
  self._auto_recover = False
1352
1354
  self._stopped.set()
1353
1355
  if self._monitor_task and not self._monitor_task.done():
1354
- await self._monitor_task
1356
+ # Cancel the monitor task to ensure it exits immediately
1357
+ self._monitor_task.cancel()
1358
+ try:
1359
+ await self._monitor_task
1360
+ except asyncio.CancelledError:
1361
+ pass # Expected when cancelling the task
1355
1362
  self._monitor_task = None
1356
1363
  await self.stop_sub_pools()
1357
1364
  await super().stop()
@@ -1406,19 +1413,17 @@ class MainActorPoolBase(ActorPoolBase):
1406
1413
  )
1407
1414
  try:
1408
1415
  if timeout is None:
1409
- message = await self.call(address, stop_message)
1410
- if isinstance(message, ErrorMessage): # pragma: no cover
1411
- raise message.as_instanceof_cause()
1412
- else:
1413
- call = asyncio.create_task(self.call(address, stop_message))
1414
- try:
1415
- await asyncio.wait_for(call, timeout)
1416
- except (futures.TimeoutError, asyncio.TimeoutError): # pragma: no cover
1417
- # timeout, just let kill to finish it
1418
- force = True
1419
- except (ConnectionError, ServerClosed): # pragma: no cover
1416
+ # Use a short timeout for graceful shutdown to avoid hanging
1417
+ timeout = 2.0
1418
+
1419
+ call = asyncio.create_task(self.call(address, stop_message))
1420
+ try:
1421
+ await asyncio.wait_for(call, timeout)
1422
+ except (futures.TimeoutError, asyncio.TimeoutError):
1423
+ force = True
1424
+ except (ConnectionError, ServerClosed):
1420
1425
  # process dead maybe, ignore it
1421
- pass
1426
+ force = True
1422
1427
  # kill process
1423
1428
  await self.kill_sub_pool(process, force=force)
1424
1429
 
@@ -16,6 +16,7 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import asyncio
19
+ import sys
19
20
  from typing import Any, Optional
20
21
 
21
22
  from ..communication import DummyServer, gen_local_address
@@ -153,9 +154,44 @@ class TestMainActorPool(MainActorPool):
153
154
  async def kill_sub_pool(
154
155
  self, process: asyncio.subprocess.Process, force: bool = False
155
156
  ):
156
- pass
157
+ # Test pool uses None for processes, so skip if process is None
158
+ if process is None:
159
+ return
160
+
161
+ if force:
162
+ try:
163
+ process.kill()
164
+ except ProcessLookupError:
165
+ pass
166
+
167
+ # Ensure process is completely terminated and cleaned up
168
+ try:
169
+ # Wait for process to complete
170
+ if process.returncode is None:
171
+ try:
172
+ await asyncio.wait_for(process.wait(), timeout=5.0)
173
+ except asyncio.TimeoutError:
174
+ pass
175
+ except ProcessLookupError:
176
+ pass
177
+
178
+ # Python 3.13 specific cleanup for waitpid threads
179
+ if sys.version_info >= (3, 13):
180
+ try:
181
+ # Close the transport to clean up waitpid thread
182
+ if hasattr(process, "_transport") and process._transport:
183
+ process._transport.close()
184
+ # Also try to close the pipe transport if it exists
185
+ if hasattr(process, "_pipes") and process._pipes:
186
+ for pipe in process._pipes.values():
187
+ if hasattr(pipe, "close"):
188
+ pipe.close()
189
+ except Exception:
190
+ # Ignore errors during cleanup
191
+ pass
157
192
 
158
193
  async def is_sub_pool_alive(self, process: asyncio.subprocess.Process):
194
+ # Test pool uses None for processes, so always return True
159
195
  return True
160
196
 
161
197
 
xoscar/collective/uv.dll CHANGED
Binary file
Binary file
Binary file
xoscar/utils.py CHANGED
@@ -470,6 +470,11 @@ def is_py_312():
470
470
  return sys.version_info[:2] == (3, 12)
471
471
 
472
472
 
473
+ @lru_cache
474
+ def is_py_312_or_above():
475
+ return sys.version_info[:2] >= (3, 12)
476
+
477
+
473
478
  def is_v4_zero_ip(ip_port_addr: str) -> bool:
474
479
  return ip_port_addr.split("://")[-1].startswith("0.0.0.0:")
475
480
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xoscar
3
- Version: 0.7.17
3
+ Version: 0.8.0
4
4
  Summary: Python actor framework for heterogeneous computing.
5
5
  Home-page: http://github.com/xorbitsai/xoscar
6
6
  Author: Qin Xuye
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.9
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
18
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
19
20
  Classifier: Topic :: Software Development :: Libraries
20
21
  Description-Content-Type: text/markdown
@@ -1,5 +1,5 @@
1
1
  xoscar/__init__.py,sha256=lzCXUmkuIjcjkiNQFekysdJR_ZhlbjcfR5ka1bZZNQg,1683
2
- xoscar/_utils.cp310-win_amd64.pyd,sha256=HAKncNrvE1oYPWzsVc2CJ-aDL_bK6hbfxMYmYdWjUEI,114688
2
+ xoscar/_utils.cp310-win_amd64.pyd,sha256=DwKNF_ZAChFzRW2ip6tVWGjq33Sy2fVAie8f4eR48Hs,114688
3
3
  xoscar/_utils.pxd,sha256=rlNbTg5lhXA-jCOLksqF4jhUlNn0xw2jx1HxdLa34pc,1193
4
4
  xoscar/_utils.pyx,sha256=TWScgqmJGYzjbWBOShBLkq07ldfYEQ5fw6V4OytX_IA,7626
5
5
  xoscar/_version.py,sha256=bsfCVAo_o9LkiP3AjPsP4SRRqhjuS0t4D1WGJPzbdls,24412
@@ -7,10 +7,10 @@ xoscar/api.py,sha256=QQDHn-_FiDExmOxEk8BUnq4Qrx13VX3shSlEEqPQJo0,15175
7
7
  xoscar/backend.py,sha256=8G5JwjoOT6Q2slb11eXNApxgcmvNQUCdQzkoIMDwLcQ,1917
8
8
  xoscar/batch.py,sha256=Jk5BSpvMFAV9DrRy0a9tgPvIo_dt8cbJReZBL0cnOPc,8128
9
9
  xoscar/constants.py,sha256=GJ1KEOxwnqksc9K_GH42TSWpQECeC6ti3KJmE3PUcTw,810
10
- xoscar/context.cp310-win_amd64.pyd,sha256=tjsTX_oUMJUaTGrn8v5e3LNpVA2oE9aXxMdBAAHDg7E,161792
10
+ xoscar/context.cp310-win_amd64.pyd,sha256=EqqTVC7Un-11mddb52cLsXdPv9HJCj4Y-XVcmwiJUt8,161792
11
11
  xoscar/context.pxd,sha256=6n6IAbmArSRq8EjcsbS6npW8xP1jI0qOoS1fF0oyj-o,746
12
12
  xoscar/context.pyx,sha256=FOJVerGOvxe2USryXEQA0rpaFX_ScxISH6QWKUcahY8,11310
13
- xoscar/core.cp310-win_amd64.pyd,sha256=PnEJyC4U8SYg4EsonXXwb3FF17yC8pnqD-gwbT2eXwY,322048
13
+ xoscar/core.cp310-win_amd64.pyd,sha256=Lsf_1-4hqEje7WbX05EMx4V1jH4MjLMTEhMfQyhLEGA,322048
14
14
  xoscar/core.pxd,sha256=9IZP7dYGfnF1I-obIls8R8b6forxDOPbiM3v5nVslLk,1368
15
15
  xoscar/core.pyx,sha256=U6jCZN74MQHi7HkQRaVGm_w5q-FMsw0nnE3aU6533_Q,22756
16
16
  xoscar/debug.py,sha256=hrmxIH6zvTKasQo6PUUgXu5mgEsR0g87Fvpw7CoHipg,5257
@@ -19,7 +19,7 @@ xoscar/errors.py,sha256=hfIAlYuSVfB3dAQYr8hTLAMmfy5en6Y8mihdtw1gTEE,1304
19
19
  xoscar/libcpp.pxd,sha256=XGy887HXdRsvF47s-A7PvHX6Gaf15d_azRscWJY0Hc8,1178
20
20
  xoscar/nvutils.py,sha256=z6RCVs0sgKFm55TTgAYG3qy5f_AKJzjcH2kcRB-wTJQ,21129
21
21
  xoscar/profiling.py,sha256=LUqkj6sSxaFj0ltS7Yk2kFsh5ieHY417xypTYHwQOb4,8275
22
- xoscar/utils.py,sha256=lYZWgnyTLL3vowzJ37ycPPPeaxQPhunGsYadRc0sAaM,17017
22
+ xoscar/utils.py,sha256=v2HDyjVe5uiJEtUnzHeOyXCqfLz0k4RRmv0RS8iQlxA,17104
23
23
  xoscar/aio/__init__.py,sha256=ZLJlVJJH5EhItKD6tLTBri-4FV4kT1O2qdIfBC-df98,691
24
24
  xoscar/aio/base.py,sha256=ytknTCjTjNQbTM7l7QGXqPYYUkD7qq-zVBGVZ34L1Tc,2335
25
25
  xoscar/aio/file.py,sha256=x1wrvDgtTFMv-6gjSPpBU26jAO5uEAlXGGnFtx7uevQ,1545
@@ -29,17 +29,17 @@ xoscar/backends/__init__.py,sha256=g9OllTquu9MRB5nySVoyiRv2z-_OSALWrOhwt7L9WXc,6
29
29
  xoscar/backends/allocate_strategy.py,sha256=DzvTlixwzTANURI2mDLHm3vcaugSPDxU6UQZb89KH0U,5005
30
30
  xoscar/backends/config.py,sha256=86j0g_Xrl8ENPzBWi296yWg9QEcljvdKK-yJbfYTvQ0,5532
31
31
  xoscar/backends/context.py,sha256=qWwksx8JxYcKR-LQA3PvXh4ReuuTTEyDaLbjpxGXcTA,16766
32
- xoscar/backends/core.py,sha256=fbekAxys_t1Dv7if-1R6uVvC_yAxNkXLeQ1V1ZSAfC0,11161
33
- xoscar/backends/message.cp310-win_amd64.pyd,sha256=a8K7Wez2Qyjm0gyNG-36Oo9VsRisaQzftJGKMTXRig0,244224
32
+ xoscar/backends/core.py,sha256=edlPDR3VH2tBLx3ZmtNktKOTsrG9AUDPW2Y_QRqXiLs,13197
33
+ xoscar/backends/message.cp310-win_amd64.pyd,sha256=P6eME6qnBSBQJEDSGhmmNRqPoIQckbl5O_d9iZH7srU,244224
34
34
  xoscar/backends/message.pyx,sha256=lBEjMJv4VyxmeO9lHXJJazOajbFnTLak4PSBcLoPZvU,20331
35
- xoscar/backends/pool.py,sha256=bS_m8XBkfQQsCOaLEzM6HkV5e78dPPp1bCH6yjvPEss,62153
35
+ xoscar/backends/pool.py,sha256=vLWEdTYg08nPy0tFf8nBA8gamBh1wSslsYaIsDl7vPU,62313
36
36
  xoscar/backends/router.py,sha256=EjfNpQUrhFU15eYe1kRPueziHgI2gfDViUzm7ruvXDE,10817
37
37
  xoscar/backends/communication/__init__.py,sha256=i0RWfN_no-xwlzLUl8Av8zZqVWxfgBaT2qbUvOLt37s,1093
38
38
  xoscar/backends/communication/base.py,sha256=wmWTeE4lcB_ohqyJJ6MdzMGcrOqy2RSKRp8y-NDuFdY,7736
39
39
  xoscar/backends/communication/core.py,sha256=ZM_fU0yokoPzXcJ6j-89llp2r7J9pl3gE5iImn4b4bE,2199
40
40
  xoscar/backends/communication/dummy.py,sha256=h04je_WcGCjpjf-vHUsY_Rou_s370pzP1R-Q2yeBaWg,8410
41
41
  xoscar/backends/communication/errors.py,sha256=-O6ZaKs6Gz7g_ZnKU2wrz8D9btowqaYuQ9u0zCYSLWo,743
42
- xoscar/backends/communication/socket.py,sha256=Ecg30cXzTxtbg7GrcUHC_1fLrLMsHNdaexkzcTtf5no,14872
42
+ xoscar/backends/communication/socket.py,sha256=4etCT3bSzCfvXlAsHtkcTLIU4PRdk6FlrjdBABPiTMY,14926
43
43
  xoscar/backends/communication/ucx.py,sha256=SQh461aiqdKKZe9fC4sDroFO2FmtQ_vX0oKSQjnqoFA,20498
44
44
  xoscar/backends/communication/utils.py,sha256=F-muF5_ow9JzAPAZ3d8XaGDiz3bRZOdWmWBDwQOVLe0,3761
45
45
  xoscar/backends/indigen/__init__.py,sha256=Khr2aGbaIw_04NIdY7QNhdljCKbmmzLb4NeAOM3LF8M,701
@@ -47,18 +47,18 @@ xoscar/backends/indigen/__main__.py,sha256=VeHSoiqCRyx9QMFO4Bnsiblhrn63qKY604Fv4
47
47
  xoscar/backends/indigen/backend.py,sha256=cCMkZDEKuRQlFb6v79JvWi5lfzsvAafznOeEWlw7CWY,1663
48
48
  xoscar/backends/indigen/driver.py,sha256=uLPBAxG7q8ds6yc-baeYUWu_m4K1gST3_BPqkfnlarw,978
49
49
  xoscar/backends/indigen/fate_sharing.py,sha256=r1U5hJ1tVOQa-ncCcX731LKbHon1i-WQdxcqwLX5sOQ,8876
50
- xoscar/backends/indigen/pool.py,sha256=l2zT_F2znfoZHAUAv2KpUJuo51n3UNd7_4eBOTUUuWo,17038
50
+ xoscar/backends/indigen/pool.py,sha256=TTMbEZk5snv8ky_YbnxEd3boa3By3yyABBVKXD83HTU,19013
51
51
  xoscar/backends/indigen/shared_memory.py,sha256=bfRKIvmtnUmkx9zhgwEMFO-in082Eb-YO2txFeFvhIY,19630
52
52
  xoscar/backends/test/__init__.py,sha256=xgE4hbD3g46G1GDJEeozaXIk57XaahmFMNQsnRzRcrs,698
53
53
  xoscar/backends/test/backend.py,sha256=Q4C6TFQzZogjugGmPh3QZw4IigL8VGCFOJ5fKkE1Uvk,1301
54
- xoscar/backends/test/pool.py,sha256=gh9Q7ml8XSCZS7EB5FSTwJdVesYMXRuvyS6HefWrF1U,7079
54
+ xoscar/backends/test/pool.py,sha256=6oxD65EQoZLQ35UA-RecXSX6cpvY0GxjNw6teT0KFyA,8490
55
55
  xoscar/collective/__init__.py,sha256=3tTgFXALDbAwmEDtmBX7PN7N6ZrcPFC4evMXMIhBtsg,801
56
56
  xoscar/collective/common.py,sha256=9c7xq3IOUvfA0I9GnpalUqXZOzmF6IEILv4zL64BYVE,3663
57
57
  xoscar/collective/core.py,sha256=191aPxbUgWpjzrqyozndImDAQhZFmqoQdBkHFLDfXN0,24239
58
58
  xoscar/collective/process_group.py,sha256=kTPbrLMJSGhqbiWvTIiz-X3W0rZWd_CFn_zUIlXbOlM,23286
59
59
  xoscar/collective/utils.py,sha256=p3WEVtXvnVhkuO5mRgQBhBRFr1dKHcDKMjrbMyuiyfg,1219
60
- xoscar/collective/uv.dll,sha256=asFNpWJyYV_2HrFxDub-UiOvpn-hKDZhc8p1mMi3Ymw,620544
61
- xoscar/collective/xoscar_pygloo.cp310-win_amd64.pyd,sha256=17LRSS01H9aiy-3on2w8B9ERdKY3cGCSnFNe2yqDfuM,779264
60
+ xoscar/collective/uv.dll,sha256=18Jd5gyIEgyBbyLwkxIQXSCTz-Sfg7N-2a1wwAaL-Y4,620544
61
+ xoscar/collective/xoscar_pygloo.cp310-win_amd64.pyd,sha256=3zPKWtGqz_yMlZ3ux6WHcjEblSjnpdqrM2OARU2QRMo,779264
62
62
  xoscar/collective/backend/__init__.py,sha256=ddL0XEwB6InL4A6Z6eKsYKoDbMSC9s_mwLBPhOcnDfI,594
63
63
  xoscar/collective/backend/nccl_backend.py,sha256=lp05ki_qhfdYEqG8HxG2ZSSfLoLlx1oMY7uwsD5I7-0,6440
64
64
  xoscar/metrics/__init__.py,sha256=RjXuuYw4I2YYgD8UY2Z5yCZk0Z56xMJ1n40O80Dtxf8,726
@@ -71,7 +71,7 @@ xoscar/metrics/backends/prometheus/__init__.py,sha256=ZHepfhCDRuK9yz4pAM7bjpWDvS
71
71
  xoscar/metrics/backends/prometheus/prometheus_metric.py,sha256=65hb8O3tmsEJ7jgOrIwl_suj9SE5Tmqcfjuk0urkLvE,2120
72
72
  xoscar/serialization/__init__.py,sha256=tS8C49yrW_geWNEsbgW3phK1q4YN1ojI6CN-vroIFYM,876
73
73
  xoscar/serialization/aio.py,sha256=7YLXgkWpQ3ANy-TZ1qO8Mt4_J3cZFhFh2FEgUgxMT60,4873
74
- xoscar/serialization/core.cp310-win_amd64.pyd,sha256=WmxpX-M22SCvkolnexZRXw1sfaFbzVgeEMdUfx8NiMs,266240
74
+ xoscar/serialization/core.cp310-win_amd64.pyd,sha256=o7WLO6uZlq1tCVGp_2Z0-Hr50yNmzEAqxJaSOH6e_oA,266240
75
75
  xoscar/serialization/core.pxd,sha256=X-47bqBM2Kzw5SkLqICdKD0gU6CpmLsBxC3kfW--wVk,1013
76
76
  xoscar/serialization/core.pyx,sha256=ZKexLRnRwZXXn2045kR7xfM_szcoPNrDuouQCWtpFp8,30570
77
77
  xoscar/serialization/cuda.py,sha256=Fj4Cpr_YmkGceUCo0mQn8fRvmHP_5WcLdRx6epZ3RC0,3869
@@ -85,7 +85,7 @@ xoscar/virtualenv/core.py,sha256=nRfOcKQbb-4TjtLmeMepFnMPLySJAIFwFJsXvXnNv44,836
85
85
  xoscar/virtualenv/platform.py,sha256=pykIAB8R5uHHQc8igPt-6dHisoVscRKnUcNPrPIFWrY,1597
86
86
  xoscar/virtualenv/utils.py,sha256=WzhEnwgGNQV5sRqZrdvCyQPcJqI5V9feBLM_Mr7UD-w,2975
87
87
  xoscar/virtualenv/uv.py,sha256=m95UyJ9BnWHqAoRI_yT1PFB11ulr_CS_pBd_gKkOkyU,11412
88
- xoscar-0.7.17.dist-info/METADATA,sha256=rkEs0pYiIprCwjMGv8b1WDNIBBg5f0apVbDpp8XB8Jo,9361
89
- xoscar-0.7.17.dist-info/WHEEL,sha256=NVXpD7b4Gxps0cd2ds5rr5TG8W4ApEwx_i5J99qMZ5E,102
90
- xoscar-0.7.17.dist-info/top_level.txt,sha256=vYlqqY4Nys8Thm1hePIuUv8eQePdULVWMmt7lXtX_ZA,21
91
- xoscar-0.7.17.dist-info/RECORD,,
88
+ xoscar-0.8.0.dist-info/METADATA,sha256=k1mg2xNaHwB2sd-eJY2nKJYNoLVOBZ91uzl2nvDvNUY,9412
89
+ xoscar-0.8.0.dist-info/WHEEL,sha256=NVXpD7b4Gxps0cd2ds5rr5TG8W4ApEwx_i5J99qMZ5E,102
90
+ xoscar-0.8.0.dist-info/top_level.txt,sha256=vYlqqY4Nys8Thm1hePIuUv8eQePdULVWMmt7lXtX_ZA,21
91
+ xoscar-0.8.0.dist-info/RECORD,,