def current_thread_id() -> str:
+ """Returns a string composed of the parent process' id, the current
+ process' id and the current thread identifier. The former two are
+ numbers (pids) whereas the latter is a thread id passed during thread
+ creation time.
+
+ >>> ret = current_thread_id()
+ >>> (ppid, pid, tid) = ret.split('/')
+ >>> ppid.isnumeric()
+ True
+ >>> pid.isnumeric()
+ True
+
+ """
ppid = os.getppid()
pid = os.getpid()
tid = threading.current_thread().name
def is_current_thread_main_thread() -> bool:
"""Returns True is the current (calling) thread is the process' main
thread and False otherwise.
+
+ >>> is_current_thread_main_thread()
+ True
+
+ >>> result = None
+ >>> def thunk():
+ ... global result
+ ... result = is_current_thread_main_thread()
+
+ >>> thunk()
+ >>> result
+ True
+
+ >>> import threading
+ >>> thread = threading.Thread(target=thunk)
+ >>> thread.start()
+ >>> thread.join()
+ >>> result
+ False
+
"""
return threading.current_thread() is threading.main_thread()
def wrapper(funct: Callable):
@functools.wraps(funct)
- def inner_wrapper(
- *a, **kwa
- ) -> Tuple[threading.Thread, threading.Event]:
+ def inner_wrapper(*a, **kwa) -> Tuple[threading.Thread, threading.Event]:
should_terminate = threading.Event()
should_terminate.clear()
newargs = (*a, should_terminate)
should_terminate = threading.Event()
should_terminate.clear()
newargs = (should_terminate, *args)
- thread = threading.Thread(
- target=helper_thread, args=newargs, kwargs=kwargs
- )
+ thread = threading.Thread(target=helper_thread, args=newargs, kwargs=kwargs)
thread.start()
logger.debug(f'Started thread {thread.name} tid={thread.ident}')
return (thread, should_terminate)
return wrapper_repeat
return decorator_repeat
+
+
+if __name__ == '__main__':
+ import doctest
+
+ doctest.testmod()