【发布时间】:2020-07-09 00:30:56
【问题描述】:
我在 Python 中创建了一个处理器类,它需要并行(或串行)执行多个可执行文件。 Processor 和 Executable 类可能如下所示:
Class Processor(object):
executables: list() # list of Executable objects
should_execute_in_parallel: bool
attr1: object
attr2: object
def process():
# Pre-processing
# Execute all executables serailly/parallely based on self.should_execute_in_parallel
# Post-processing
Class Executable(object):
cmd: str # command string to execute
attr1: object
attr2: object
我创建了一个 Executor 类,它接受一个可执行文件并执行它
class Executor(object):
def __init__(self, executable):
self.executable = executable
# This is to demonstrate that Executor object is stateful
self.executable_id = self._get_executable_id(self.executable)
def execute():
# Pre-processing (I/O bound, depends on self)
# Launch separate process for self.executable & monitor (I/O during each monitoring phase)
# Post-processing (I/O bound, depends on self)
我希望在 Processor.process() 中并行化 Executor.execute()。由于每个 Executor.execute() 调用都会产生一个新的 Python 进程,因此处理器级别的多处理可能会过大。因此,我正在考虑为每个 Executor 对象使用多个线程,这反过来将为相应的可执行文件生成一个新进程并继续对其进行监控。
注意:由 Executor.execute() 启动的进程需要由 Executor 对象定期监控,为此我使用了 python 警报。 I/O 发生在每个监控阶段。
- 在 python 中是否有推荐/最佳方式将多线程与多处理相结合(如上)?
- 只要 Executor.execute() 不受 CPU 限制(不包括衍生的进程),会不会有任何 GIL 问题?
- 如果 Executor 对象是无状态的,这里会更容易实现并行性吗?
- 有没有更好的方法来解决这个用例?
【问题讨论】:
标签: python multithreading parallel-processing multiprocessing gil