42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
"""
|
|
This file contains functions for reading and writing between processes.
|
|
|
|
Author(s): David Marchant
|
|
"""
|
|
|
|
from os import name as osName
|
|
from typing import List
|
|
|
|
from multiprocessing.connection import Connection, wait as multi_wait
|
|
# Need to import additional Connection type for Windows machines
|
|
if osName == 'nt':
|
|
from multiprocessing.connection import PipeConnection
|
|
from multiprocessing.queues import Queue
|
|
from core.correctness.vars import VALID_CHANNELS
|
|
|
|
|
|
def wait(inputs:List[VALID_CHANNELS])->List[VALID_CHANNELS]:
|
|
if osName == 'nt':
|
|
return wait_windows(inputs)
|
|
return wait_linux(inputs)
|
|
|
|
def wait_windows(inputs:List[VALID_CHANNELS])->List[VALID_CHANNELS]:
|
|
all_connections = [i for i in inputs if type(i) is Connection] \
|
|
+ [i for i in inputs if type(i) is PipeConnection] \
|
|
+ [i._reader for i in inputs if type(i) is Queue]
|
|
ready = multi_wait(all_connections)
|
|
ready_inputs = [i for i in inputs if \
|
|
(type(i) is Connection and i in ready) \
|
|
or (type(i) is PipeConnection and i in ready) \
|
|
or (type(i) is Queue and i._reader in ready)]
|
|
return ready_inputs
|
|
|
|
def wait_linux(inputs:List[VALID_CHANNELS])->List[VALID_CHANNELS]:
|
|
all_connections = [i for i in inputs if type(i) is Connection] \
|
|
+ [i._reader for i in inputs if type(i) is Queue]
|
|
ready = multi_wait(all_connections)
|
|
ready_inputs = [i for i in inputs if \
|
|
(type(i) is Connection and i in ready) \
|
|
or (type(i) is Queue and i._reader in ready)]
|
|
return ready_inputs
|