|
import os |
|
import socket |
|
import time |
|
import uuid |
|
from contextlib import closing |
|
from threading import Thread |
|
from typing import Any |
|
|
|
|
|
def get_ip() -> str: |
|
""" |
|
Overview: |
|
Get the ``ip(host)`` of socket |
|
Returns: |
|
- ip(:obj:`str`): The corresponding ip |
|
""" |
|
|
|
myname = socket.getfqdn(socket.gethostname()) |
|
myaddr = socket.gethostbyname(myname) |
|
|
|
return myaddr |
|
|
|
|
|
def get_pid() -> int: |
|
""" |
|
Overview: |
|
``os.getpid`` |
|
""" |
|
return os.getpid() |
|
|
|
|
|
def get_task_uid() -> str: |
|
""" |
|
Overview: |
|
Get the slurm ``job_id``, ``pid`` and ``uid`` |
|
""" |
|
return '{}_{}'.format(str(uuid.uuid4()), str(time.time())[-6:]) |
|
|
|
|
|
class PropagatingThread(Thread): |
|
""" |
|
Overview: |
|
Subclass of Thread that propagates execution exception in the thread to the caller |
|
Interfaces: |
|
``run``, ``join`` |
|
Examples: |
|
>>> def func(): |
|
>>> raise Exception() |
|
>>> t = PropagatingThread(target=func, args=()) |
|
>>> t.start() |
|
>>> t.join() |
|
""" |
|
|
|
def run(self) -> None: |
|
""" |
|
Overview: |
|
Run the thread |
|
""" |
|
|
|
self.exc = None |
|
try: |
|
self.ret = self._target(*self._args, **self._kwargs) |
|
except Exception as e: |
|
self.exc = e |
|
|
|
def join(self) -> Any: |
|
""" |
|
Overview: |
|
Join the thread |
|
""" |
|
|
|
super(PropagatingThread, self).join() |
|
if self.exc: |
|
raise RuntimeError('Exception in thread({})'.format(id(self))) from self.exc |
|
return self.ret |
|
|
|
|
|
def find_free_port(host: str) -> int: |
|
""" |
|
Overview: |
|
Look up the free port list and return one |
|
Arguments: |
|
- host (:obj:`str`): The host |
|
""" |
|
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: |
|
s.bind(('', 0)) |
|
return s.getsockname()[1] |
|
|