ladyrick 0.5.5__tar.gz → 0.5.6__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 (34) hide show
  1. {ladyrick-0.5.5 → ladyrick-0.5.6}/PKG-INFO +1 -1
  2. {ladyrick-0.5.5 → ladyrick-0.5.6}/pyproject.toml +1 -1
  3. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/multi_ssh.py +26 -13
  4. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/test_signal.py +2 -2
  5. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/PKG-INFO +1 -1
  6. {ladyrick-0.5.5 → ladyrick-0.5.6}/LICENSE +0 -0
  7. {ladyrick-0.5.5 → ladyrick-0.5.6}/README.md +0 -0
  8. {ladyrick-0.5.5 → ladyrick-0.5.6}/setup.cfg +0 -0
  9. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/__init__.py +0 -0
  10. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/allgather.py +0 -0
  11. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/calc.py +0 -0
  12. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/psf.py +0 -0
  13. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/tee.py +0 -0
  14. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/cli/test_args.py +0 -0
  15. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/debug.py +0 -0
  16. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/loader.py +0 -0
  17. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/__init__.py +0 -0
  18. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/print.py +0 -0
  19. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/python/__init__.py +0 -0
  20. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/python/__main__.py +0 -0
  21. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/python/usercustomize.py +0 -0
  22. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/patch/rich_print.py +0 -0
  23. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/pickle.py +0 -0
  24. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/pprint.py +0 -0
  25. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/print_utils.py +0 -0
  26. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/torch.py +0 -0
  27. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/typing.py +0 -0
  28. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/utils.py +0 -0
  29. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick/vars.py +0 -0
  30. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/SOURCES.txt +0 -0
  31. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/dependency_links.txt +0 -0
  32. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/entry_points.txt +0 -0
  33. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/requires.txt +0 -0
  34. {ladyrick-0.5.5 → ladyrick-0.5.6}/src/ladyrick.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ladyrick
3
- Version: 0.5.5
3
+ Version: 0.5.6
4
4
  Summary: ladyrick's tools
5
5
  Author-email: ladyrick <ladyrick@qq.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ladyrick"
7
- version = "0.5.5"
7
+ version = "0.5.6"
8
8
  authors = [{ name = "ladyrick", email = "ladyrick@qq.com" }]
9
9
  description = "ladyrick's tools"
10
10
  readme = "README.md"
@@ -52,14 +52,14 @@ def remote_head():
52
52
  def handle_signal(sig, frame=None):
53
53
  if sig == signal.SIGUSR2:
54
54
  # SIGUSR2 trigger force_kill manually
55
- print("SIGUSR2 received. force kill")
55
+ log("SIGUSR2 received. force kill")
56
56
  force_kill(child, child_pgid)
57
57
  else:
58
- print(f"forward signal {sig} to {child.pid}")
58
+ log(f"forward signal {sig} to {child.pid}")
59
59
  try:
60
60
  os.kill(child.pid, sig)
61
61
  except ProcessLookupError as e:
62
- print(str(e))
62
+ log(str(e))
63
63
 
64
64
  for sig in [signal.SIGHUP, signal.SIGINT, signal.SIGTERM, signal.SIGUSR1, signal.SIGUSR2]:
65
65
  signal.signal(sig, handle_signal)
@@ -202,12 +202,17 @@ class RemoteExecutor:
202
202
  except (BrokenPipeError, OSError) as e:
203
203
  log(e)
204
204
 
205
+ def terminate(self):
206
+ if self.process is not None and self.process.poll() is None:
207
+ log("terminate RemoteExecutor")
208
+ self.process.terminate()
209
+
205
210
  def poll(self):
206
211
  assert self.process is not None
207
212
  return self.process.poll()
208
213
 
209
214
 
210
- def signal_repeat_checker(sig_to_check, count, duration):
215
+ def signal_repeat_checker(sig_to_check, duration: float):
211
216
  last_int_signal_time = []
212
217
 
213
218
  def checker(sig: signal.Signals):
@@ -217,11 +222,8 @@ def signal_repeat_checker(sig_to_check, count, duration):
217
222
  threadhold = cur_time - duration
218
223
  last_int_signal_time = [t for t in last_int_signal_time if t >= threadhold]
219
224
  last_int_signal_time.append(cur_time)
220
-
221
- if len(last_int_signal_time) >= count:
222
- log(f"received {sig_to_check.name} for {count} times or more in {duration} second(s)")
223
- return True
224
- return False
225
+ return len(last_int_signal_time)
226
+ return 0
225
227
 
226
228
  return checker
227
229
 
@@ -290,16 +292,27 @@ def main():
290
292
  for executor in executors:
291
293
  executor.start()
292
294
 
293
- checker = signal_repeat_checker(signal.SIGINT, count=3, duration=1)
295
+ import rich
296
+
297
+ checker = signal_repeat_checker(signal.SIGINT, duration=1)
294
298
 
295
299
  def handle_signal(sig, frame):
296
- if checker(sig):
300
+ log(f"received signal {sig}")
301
+ sig_count = checker(sig)
302
+ if sig_count >= 3:
297
303
  sig = signal.SIGUSR2
298
- log("\nTry to froce kill remote processes")
304
+ if sig_count == 3:
305
+ rich.print("\n[bold magenta]Can't wait. Try to froce kill remote processes...[/bold magenta]")
299
306
  else:
300
- log(f"\nReceived {signal.Signals(sig).name}, forwarding...")
307
+ rich.print(
308
+ f"\n[bold green]Received {signal.Signals(sig).name}, forwarding to remote processes...[/bold green]"
309
+ )
301
310
  for executor in executors:
302
311
  executor.send_signal(sig)
312
+ if sig_count >= 4:
313
+ rich.print("\n[bold red]Really Can't wait!!! Froce kill local processes and exiting right now![/bold red]")
314
+ for executor in executors:
315
+ executor.terminate()
303
316
 
304
317
  for sig in [signal.SIGHUP, signal.SIGINT, signal.SIGTERM, signal.SIGUSR1, signal.SIGUSR2]:
305
318
  signal.signal(sig, handle_signal)
@@ -5,8 +5,8 @@ import time
5
5
 
6
6
  def handle_signal(sig, frame):
7
7
  print(f"received signal {sig}, {signal.Signals(sig).name}", flush=True)
8
- # if sig in {signal.SIGTERM, signal.SIGINT, signal.SIGHUP}:
9
- # sys.exit(0)
8
+ if sig in {signal.SIGTERM, signal.SIGINT, signal.SIGHUP}:
9
+ sys.exit(0)
10
10
 
11
11
 
12
12
  for sig in [s for s in vars(signal).values() if isinstance(s, signal.Signals)]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ladyrick
3
- Version: 0.5.5
3
+ Version: 0.5.6
4
4
  Summary: ladyrick's tools
5
5
  Author-email: ladyrick <ladyrick@qq.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes