Added threading.py
* Will be used by hw_diags.py and ddrescue.py for * Better control over badblocks * Background the tmux pane fixes
This commit is contained in:
parent
aa4c6a1434
commit
4a04e92caf
1 changed files with 47 additions and 0 deletions
47
.bin/Scripts/functions/threading.py
Normal file
47
.bin/Scripts/functions/threading.py
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Wizard Kit: Functions - Threading
|
||||||
|
|
||||||
|
from threading import Thread
|
||||||
|
from queue import Queue, Empty
|
||||||
|
|
||||||
|
# Classes
|
||||||
|
class NonBlockingStreamReader():
|
||||||
|
"""Class to allow non-blocking reads from a stream."""
|
||||||
|
# Credits:
|
||||||
|
## https://gist.github.com/EyalAr/7915597
|
||||||
|
## https://stackoverflow.com/a/4896288
|
||||||
|
|
||||||
|
def __init__(self, stream):
|
||||||
|
self.stream = stream
|
||||||
|
self.queue = Queue()
|
||||||
|
|
||||||
|
def populate_queue(stream, queue):
|
||||||
|
"""Collect lines from stream and put them in queue."""
|
||||||
|
while True:
|
||||||
|
line = stream.read(1)
|
||||||
|
if line:
|
||||||
|
queue.put(line)
|
||||||
|
|
||||||
|
self.thread = start_thread(
|
||||||
|
populate_queue,
|
||||||
|
args=(self.stream, self.queue))
|
||||||
|
|
||||||
|
def read(self, timeout=None):
|
||||||
|
try:
|
||||||
|
return self.queue.get(block = timeout is not None,
|
||||||
|
timeout = timeout)
|
||||||
|
except Empty:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
def start_thread(function, args=[], daemon=True):
|
||||||
|
"""Run function as thread in background, returns Thread object."""
|
||||||
|
thread = Thread(target=function, args=args, daemon=daemon)
|
||||||
|
thread.start()
|
||||||
|
return thread
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
Loading…
Reference in a new issue