Setup MultiThreadingStdStreams from child threads

This commit is contained in:
Ivan Kravets
2019-07-02 20:44:33 +03:00
parent c79d5f0cf1
commit 2988724456

View File

@ -31,7 +31,7 @@ except ImportError:
from threading import get_ident as thread_get_ident from threading import get_ident as thread_get_ident
class ThreadSafeStdBuffer(object): class MultiThreadingStdStream(object):
def __init__(self, parent_stream): def __init__(self, parent_stream):
self._buffers = {thread_get_ident(): parent_stream} self._buffers = {thread_get_ident(): parent_stream}
@ -66,9 +66,12 @@ class ThreadSafeStdBuffer(object):
class PIOCoreRPC(object): class PIOCoreRPC(object):
def __init__(self): @staticmethod
PIOCoreRPC.thread_stdout = ThreadSafeStdBuffer(sys.stdout) def setup_multithreading_std_streams():
PIOCoreRPC.thread_stderr = ThreadSafeStdBuffer(sys.stderr) if isinstance(sys.stdout, MultiThreadingStdStream):
return
PIOCoreRPC.thread_stdout = MultiThreadingStdStream(sys.stdout)
PIOCoreRPC.thread_stderr = MultiThreadingStdStream(sys.stderr)
sys.stdout = PIOCoreRPC.thread_stdout sys.stdout = PIOCoreRPC.thread_stdout
sys.stderr = PIOCoreRPC.thread_stderr sys.stderr = PIOCoreRPC.thread_stderr
@ -83,13 +86,17 @@ class PIOCoreRPC(object):
raise jsonrpc.exceptions.JSONRPCDispatchException( raise jsonrpc.exceptions.JSONRPCDispatchException(
code=4002, message="PIO Core: non-ASCII chars in arguments") code=4002, message="PIO Core: non-ASCII chars in arguments")
def _call_cli(): PIOCoreRPC.setup_multithreading_std_streams()
with util.cd((options or {}).get("cwd") or os.getcwd()): cwd = (options or {}).get("cwd") or os.getcwd()
def _call_inline():
with util.cd(cwd):
exit_code = __main__.main(["-c"] + args) exit_code = __main__.main(["-c"] + args)
return (PIOCoreRPC.thread_stdout.get_value_and_close(), return (PIOCoreRPC.thread_stdout.get_value_and_close(),
PIOCoreRPC.thread_stderr.get_value_and_close(), exit_code) PIOCoreRPC.thread_stderr.get_value_and_close(), exit_code)
d = threads.deferToThread(_call_cli) d = threads.deferToThread(_call_inline)
d.addCallback(PIOCoreRPC._call_callback, "--json-output" in args) d.addCallback(PIOCoreRPC._call_callback, "--json-output" in args)
d.addErrback(PIOCoreRPC._call_errback) d.addErrback(PIOCoreRPC._call_errback)
return d return d